使用cattr/attr从字典构造对象时如何处理默认为None的嵌套字段
报错原因
你的代码报错的核心是A类的b字段类型注解不规范:你将该字段的默认值设为None,但类型只标注了B,没有声明允许为None。cattr会默认认为该字段的所有值都需要转换为B类实例,当拿到字典中b的值为None时,仍然尝试对None执行嵌套结构校验,检查是否存在B类对应的字段,最终触发NoneType不可迭代的错误。
最优解决方案(不需要手动删字段)
补全正确的类型注解即可,这也是符合Python类型提示规范的做法:
from typing import Optional # 导入Optional类型 import attr import cattr @attr.s(auto_attribs=True) class B(object): b :int = 0 @attr.s(auto_attribs=True) class A(object): a :int = 0 b: Optional[B] = None # 明确标注该字段可以是B类实例或者None x = A(1) x_dict = attr.asdict(x) # 直接执行转换不会报错 cattr.structure(x_dict,A)
其他可选方案
如果你不想修改类型注解,也可以在序列化生成字典的阶段直接过滤掉值为None的字段,不需要后续手动删除键:
x_dict = attr.asdict(x, filter=lambda attr, value: value is not None) cattr.structure(x_dict,A)
内容的提问来源于stack exchange,提问作者agstudy
相关产品推荐
相关产品推荐

