我正在使用其中定义了以下功能的库:
@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)
},
}
以下是第三方配置__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)
我想知道如何在我的班级Config中使用第一节中的content
字段?我需要这样做的原因是我发现(通过调试)AttrHolder.from_file()
调用返回传递给它的结构的残缺表示。我希望保留content
字段中似乎可用的原始表示形式。
谢谢。
答案 0 :(得分:1)
只需使用您自己的AttrHolder
子类:
class MyAttrHolder(AttrHolder):
def __init__(self, content, _schema=None):
do_things_with(content)
super(MyAttrHolder, self).__init__(content, _schema)
...
MyAttrHolder.from_file(filename)
然后在from_file
内,cls
将是MyAttrHolder
。这是classmethod
。