Python中如何获取@classmethod内的原始content字段用于自定义类?
如何获取
from_file类方法中的原始content字段 我来帮你解决这个问题——你想要拿到from_file类方法里加载出来的原始content字典对吧?看了你的代码,问题出在第三方Config类的__init__没有保存原始的content,而是直接把它解析成了类的属性结构,所以原始数据没法直接从返回的AttrHolder实例中获取。这里有几个可行的方案:
方案1:在AttrHolder中保存原始content
直接修改AttrHolder类的__init__方法,先把传入的content保存为实例属性,再调用父类的初始化逻辑:
class AttrHolder(Config): schema = { "subject": { "email": StringEntry, "name": StringEntry }, "entitlements": { "containerName": StringEntry(required=True) }, } def __init__(self, content, _schema=None): # 保存原始content到实例属性 self._raw_content = content # 调用父类的__init__完成解析 super().__init__(content, _schema)
之后你在调用AttrHolder.from_file(filename)后,就能通过返回的实例的_raw_content属性拿到原始的yaml加载数据了:
def __load_mappings_file(self, file=None): attr_holder = AttrHolder.from_file(file) # 获取原始content raw_content = attr_holder._raw_content # 在这里做你的自定义逻辑 return attr_holder
方案2:重写from_file类方法
如果不想修改AttrHolder的__init__,可以在AttrHolder里重写from_file方法,在创建实例后给它附加原始content:
class AttrHolder(Config): schema = { # 原schema内容不变 "subject": { "email": StringEntry, "name": StringEntry }, "entitlements": { "containerName": StringEntry(required=True) }, } @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 # 创建实例并附加原始content instance = cls(content) instance._raw_content = content return instance
这个方案的用法和方案1完全一致,同样可以通过instance._raw_content获取原始数据。
方案3:单独提取加载逻辑,手动获取原始content
如果不想修改原有的AttrHolder类,你可以自己写一个工具函数来加载yaml文件,先拿到原始content,再手动创建AttrHolder实例:
def load_raw_config(path): """加载yaml文件并返回原始字典""" try: with open(path) as config_file: return yaml.safe_load(config_file) except IOError: log.error(u"Can't open configuration file '%s'" % path) raise ConfigurationError # 在你的__load_mappings_file中使用: def __load_mappings_file(self, file=None): # 先获取原始content raw_content = load_raw_config(file) # 再创建AttrHolder实例 attr_holder = AttrHolder(raw_content) # 在这里用raw_content做你的自定义处理 self._process_raw_content(raw_content) return attr_holder
这个方案完全不修改原有类的结构,只是把加载逻辑抽出来复用,灵活性更高。
内容的提问来源于stack exchange,提问作者Simeon Leyzerzon
相关产品推荐
相关产品推荐

