Я использую библиотеку, внутри которой определена следующая функция:
@classmethod
def from_file(cls, path):
try:
with open(path) as config_file:
content = yaml.safe_load(config_file)
except IOError:
log.error(u"Can't open configuration file '%s'" % path)
raise ConfigurationError
return cls(content)
, который я вызываю следующим образом из моего собственного класса:
class MyConfig(object):
def __init__(self, custom_base_path=None, mappings_file_name=None):
....
self.__cfg = self.__load_mappings_file(file=mappings_file_name)
....
def __load_mappings_file(self, file=None):
....
return AttrHolder.from_file(filename)
AttrHolder
класс определен в том же модуле:
class AttrHolder(Config):
schema = {
"subject": {
"email": StringEntry,
"name": StringEntry
},
"entitlements": {
"containerName": StringEntry(required=True)
},
}
Вот код для стороннего Config's __init__
:
def __init__(self, content, _schema=None):
if _schema:
self.schema = _schema
if self.schema and (not content or not isinstance(content, dict)):
log.error(u"Invalid configuration")
raise ConfigurationError
self.entries = {}
self.children = set()
for key, value in self.schema.items():
if isinstance(value, dict):
setattr(self, key, Config(content.get(key), _schema=value))
self.children.add(key)
elif isinstance(value, ConfigEntry):
self.parse_entry(key, value, (content or {}).get(key))
else:
log.warning(u"Invalid entry in configuration content: %s" % key)
Мне интересно, как я могу овладеть полем content
в этой первой строфе, чтобы использовать его в моем классе Config? Причина, по которой мне нужно это сделать, заключается в том, что я обнаружил (с помощью отладки), что вызов AttrHolder.from_file()
возвращает искаженное представление структуры, которая была ему передана. Я хотел бы сохранить исходное представление, которое, по-видимому, доступно в поле content
.
Спасибо.