为何无法访问operator模块itemgetter、attrgetter的实例属性?
问题原因
你在源码目录看到的Lib/operator.py中实现的itemgetter、attrgetter是纯Python编写的兜底兼容版本,仅在C扩展编译失败、或手动禁用C加速时才会被加载使用。
- 标准发行版CPython默认优先加载C编写的
_operator扩展模块里的原生实现,这两个C实现的类型根本没有定义_items、_attrs这两个实例属性,直接访问就会抛出AttributeError。 - 单下划线开头的属性属于代码内部实现的私有成员,官方从未承诺对外暴露这部分属性,也不保证不同版本、不同实现下的行为一致,业务代码不应该依赖这类内部属性编写逻辑。
验证方式
手动屏蔽C扩展加载,强制导入纯Python版本的operator模块后,就可以正常访问这两个属性,参考代码如下:
import sys import importlib.util from importlib.machinery import PathFinder # 清除已加载的operator缓存,屏蔽C扩展模块 sys.modules.pop('operator', None) sys.modules['_operator'] = None # 加载纯Python实现的operator spec = PathFinder.find_spec('operator', sys.path) py_operator = importlib.util.module_from_spec(spec) spec.loader.exec_module(py_operator) # 访问属性可正常返回结果 print(py_operator.itemgetter('name')._items) # 输出 ('name',) print(py_operator.attrgetter('a')._attrs) # 输出 ('a',)
如果业务中需要获取getter对象绑定的提取字段,不要依赖这类私有属性,建议自行封装一层带公开属性的实现,避免跨版本、跨实现的行为差异导致代码异常。
内容的提问来源于stack exchange,提问作者Adithya
相关产品推荐
相关产品推荐

