使用attrs库解析配置文件嵌套数据对象,求更优实现方案
优化attrs嵌套配置解析的两种方案
针对你用attrs解析嵌套数据对象的场景,有两种更简洁的优化方式,避免手动编写重复的转换器逻辑:
方案一:基于attrs自身字段转换器优化
利用attrs的field参数结合类方法,直接在嵌套字段中指定转换逻辑,无需单独定义from_dictstrobj方法:
代码实现
import attr from typing import Dict, TypeVar from pyhocon import ConfigFactory # 定义泛型基类,方便复用from_dict和from_hocon逻辑 T = TypeVar("T", bound="HoconParser") @attr.s(auto_attribs=True) class HoconParser: @classmethod def from_dict(cls: Type[T], data: dict) -> T: return cls(**data) @classmethod def from_hocon(cls: Type[T], hocon_str: str) -> T: # 解析Hocon字符串为字典 data = ConfigFactory.parse_string(hocon_str) return cls.from_dict(data) # 定义嵌套类ClassOne @attr.s(auto_attribs=True) class ClassOne(HoconParser): name: str value: int # 定义包含字典嵌套的ClassTwo,直接在字段中指定转换器 @attr.s(auto_attribs=True) class ClassTwo(HoconParser): test: Dict[str, ClassOne] = attr.field( converter=lambda d: {k: ClassOne.from_dict(v) for k, v in d.items()} )
这种方式的优势是无需额外依赖,逻辑直接绑定到字段定义中,可读性更强。
方案二:使用cattrs库简化嵌套解析
cattrs是attrs生态的官方序列化/反序列化工具,能自动识别并处理attrs类的嵌套结构(包括字典、列表中的嵌套对象),彻底省去手动编写转换器的麻烦:
代码实现
首先安装依赖:
pip install cattrs pyhocon
然后编写类和解析逻辑:
import attr from typing import Dict import cattrs from pyhocon import ConfigFactory # 初始化cattrs转换器,默认支持attrs类的嵌套结构 converter = cattrs.Converter() # 基类复用解析逻辑 @attr.s(auto_attribs=True) class HoconParser: @classmethod def from_dict(cls, data: dict): return converter.structure(data, cls) @classmethod def from_hocon(cls, hocon_str: str): data = ConfigFactory.parse_string(hocon_str) return cls.from_dict(data) # 定义业务类,无需手动处理转换 @attr.s(auto_attribs=True) class ClassOne(HoconParser): name: str value: int @attr.s(auto_attribs=True) class ClassTwo(HoconParser): test: Dict[str, ClassOne]
这种方式适合复杂嵌套场景,后续新增嵌套类或修改结构时,无需调整转换逻辑,扩展性极强。
内容的提问来源于stack exchange,提问作者Ares
相关产品推荐
相关产品推荐

