You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 21:05:03