使用operator.attrgetter读取数据类属性报错,求替代方案
问题解决:无法用
operator.attrgetter读取数据类的类型注解 问题重现
你的模块my_module.py代码:
from dataclasses import dataclass @dataclass class MyDataClass: foo: str bar: str
尝试用attrgetter读取MyDataClass.foo的代码:
import package.my_module from operator import attrgetter obj = attrgetter('MyDataClass.foo')(package.my_module) # 抛出AttributeError
报错信息:
AttributeError: type object 'MyDataClass' has no attribute 'foo'
原因
MyDataClass.foo不是类的直接属性,而是数据类的类型注解,它实际存储在类的__annotations__字典中,而非类的顶层属性集合里。attrgetter会直接尝试访问类的foo属性,自然找不到对应内容。
替代方法
方法1:直接访问__annotations__字典
这是最直接的方式:
import package.my_module foo_annotation = package.my_module.MyDataClass.__annotations__['foo']
方法2:自定义简易getter函数
如果需要复用逻辑,可以封装成函数:
import package.my_module def get_class_annotation(cls, attr_name): return cls.__annotations__[attr_name] foo_annotation = get_class_annotation(package.my_module.MyDataClass, 'foo')
方法3:结合attrgetter和itemgetter实现链式取值
坚持要类似attrgetter的链式写法的话,可以组合两个operator工具:
import package.my_module from operator import attrgetter, itemgetter # 先获取MyDataClass类,再从它的__annotations__字典中取foo get_foo_anno = lambda mod: itemgetter('foo')(attrgetter('MyDataClass')(mod).__annotations__) foo_annotation = get_foo_anno(package.my_module)
或者更紧凑的写法:
from operator import attrgetter, itemgetter foo_annotation = itemgetter('foo')(attrgetter('MyDataClass.__annotations__')(package.my_module))
内容的提问来源于stack exchange,提问作者wO_o
相关产品推荐
相关产品推荐

