如何判断自定义__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
相关产品推荐
相关产品推荐

