gpt4 book ai didi

Python 的 hasattr 有时会返回不正确的结果

转载 作者:太空狗 更新时间:2023-10-29 22:09:03 27 4
gpt4 key购买 nike

为什么 hasattr 说实例没有 foo 属性?

>>> class A(object):
... @property
... def foo(self):
... ErrorErrorError
...
>>> a = A()
>>> hasattr(a, 'foo')
False

我预计:

>>> hasattr(a, 'foo')
NameError: name 'ErrorErrorError' is not defined`

最佳答案

hasattr 的 Python 2 实现相当天真,它只是尝试访问该属性并查看它是否引发异常。

不幸的是,hasattr 会吃掉任何异常类型,而不仅仅是匹配试图访问的属性名称的 AttributeError。它在所示示例中捕获了 NameError,这会导致返回错误的 False 结果。雪上加霜的是,属性内任何未处理的异常都将被吞噬,属性代码内的错误可能会丢失,从而掩盖错误。

在 Python 3.2+ 中,行为已得到纠正:

hasattr(object, name)

The arguments are an object and a string. The result is True if the string is the name of one of the object’s attributes, False if not. (This is implemented by calling getattr(object, name) and seeing whether it raises an AttributeError or not.)

修复是 here ,但该更改没有得到反向移植。

如果 Python 2 行为给您带来麻烦,请考虑避免使用 hasattr;相反,您可以在 getattr 附近使用 try/except ,捕获 AttributeError 异常类型,并让任何其他未处理的异常引发。

关于Python 的 hasattr 有时会返回不正确的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35566680/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com