это класс для хранения настроек программы в формате 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()
как лучше задавать путь к файлу с настройками при определении класса config?