Найти - Пользователи
Полная версия: Как лучше всего переписать этот код?
Начало » Python для экспертов » Как лучше всего переписать этот код?
1
Dimka665
код работает, но при текущих реализации и моих знаний ооп дальнейшее его развитие невозможно.
это класс для хранения настроек программы в формате 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?
Dimka665
название темы как бы намекает))))
Dimka665
сейчас сделано так. __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}
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB