Уведомления

Группа в Telegram: @pythonsu

#1 Май 19, 2010 14:48:28

Dimka665
От:
Зарегистрирован: 2008-09-19
Сообщения: 177
Репутация: +  0  -
Профиль   Отправить e-mail  

Как лучше всего переписать этот код?

код работает, но при текущих реализации и моих знаний ооп дальнейшее его развитие невозможно.
это класс для хранения настроек программы в формате yaml. от него требуются безотказность(значения по умолчанию, работа при отсутствии файла настроек), простота и удобство использования(простой синтаксис).

import yaml
# это наш класс - реализация функционала
class EasyConfig(object):
_default_yaml_file = 'config.yaml'

def __init__(self):
raise UserWarning("Don`t create instance of class. Use class itself.")

@classmethod
def get_options(cls):
# get attributes of cls and clean it from "__doc__" etc.
return dict(filter(lambda x: x[0][0] != "_", cls.__dict__.items()))

@classmethod
def _load(cls, yaml_file=_default_yaml_file):
# read YAML-file if it exists
if os.path.isfile(yaml_file):
# save config-file name
cls._yaml_file = yaml_file
content = open(yaml_file, "rb").read()
# parse content
options = yaml.safe_load(content)
# update our options
for option in set(cls.get_options()).intersection(options):
setattr(cls, option, options[option])

@classmethod
def _save(cls, yaml_file=None):
## method called "_save", that user don`t redefine it
## when we call "_save" from child, cls is child

options = cls.get_options()

if options:
if not yaml_file:
yaml_file = cls.__dict__.get('_yaml_file', cls._default_yaml_file)
yaml_file = open(yaml_file, 'wb')
yaml_file.write(yaml.safe_dump(options, indent=4))
yaml_file.close()

# это класс с настройками
class config(EasyConfig):
# наши настройки со значениями по умолчанию
first_option = 1
dictionary = {'first': 1, 'list': [23523, 2345, 324, 'g']}

config._load()
if config.first_option == 1:
config.first_option = 2
config._save()
как реализовать __repr__ и __str__?
как лучше задавать путь к файлу с настройками при определении класса config?



Офлайн

#2 Май 19, 2010 14:55:17

Dimka665
От:
Зарегистрирован: 2008-09-19
Сообщения: 177
Репутация: +  0  -
Профиль   Отправить e-mail  

Как лучше всего переписать этот код?

название темы как бы намекает))))



Офлайн

#3 Май 20, 2010 16:23:21

Dimka665
От:
Зарегистрирован: 2008-09-19
Сообщения: 177
Репутация: +  0  -
Профиль   Отправить e-mail  

Как лучше всего переписать этот код?

сейчас сделано так. __repr__ работает.

class EasyConfig(type):
_default_yaml_file = 'config.yaml'

def get_options(cls):
# get attributes of cls and clean it from "__doc__" etc.
return dict(filter(lambda x: x[0][0] != "_", cls.__dict__.items()))

def _load(cls, yaml_file=_default_yaml_file):
# read YAML-file if it exists
if os.path.isfile(yaml_file):
# save config-file name
cls._yaml_file = yaml_file
content = open(yaml_file, "rb").read()
# parse content
options = yaml.safe_load(content)
# update our options
for option in set(cls.get_options()).intersection(options):
setattr(cls, option, options[option])

def _save(cls, yaml_file=None):

options = cls.get_options()

if options:
if not yaml_file:
yaml_file = cls.__dict__.get('_yaml_file', cls._default_yaml_file)
yaml_file = open(yaml_file, 'wb')
yaml_file.write(yaml.safe_dump(options, indent=4))
yaml_file.close()

def __repr__(cls):
return yaml.dump(cls.get_options())[:-1]

def __str__(cls):
return repr(cls)


class config():
__metaclass__ = EasyConfig

i = 1
g = {'first': 1}



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version