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

如何判断自定义__getattr__的Python模块是否存在指定属性?

解决方法:直接检查模块的__dict__属性

模块的所有已存在属性都会直接存储在它的__dict__字典中,而自定义的__getattr__仅当属性不在__dict__里时才会被调用。因此,直接判断属性名是否在模块的__dict__中,就能避免触发__getattr__,准确检测属性是否真实存在。

举个实际测试的例子:

>>> import mymodule
>>> "foo" in mymodule.__dict__
False  # 此时还没访问过foo,__dict__里没有这个键
>>> mymodule.foo
Generating foo
'some value'
>>> "foo" in mymodule.__dict__
True  # 缓存后__dict__里已经有foo了
>>> "something" in mymodule.__dict__
False  # 不会触发__getattr__,直接返回False
>>> del mymodule.foo
>>> "foo" in mymodule.__dict__
False  # 删除后__dict__里的foo被移除,符合预期

对比hasattr的问题:hasattr内部会调用getattr,一旦属性不存在就会触发__getattr__生成属性,导致误判;而直接查__dict__完全不会触发这个逻辑,结果更准确。

另外,dir(mymodule)虽然也能判断,但它会枚举所有可见属性(包括继承的),效率不如直接查__dict__高,尤其是只需要检测单个属性时,__dict__的方式更直接高效。

内容的提问来源于stack exchange,提问作者bfontaine

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 10:27:08