gpt4 book ai didi

python - hasattr 即使在捕获到异常后也返回属性错误

转载 作者:行者123 更新时间:2023-11-28 22:16:55 27 4
gpt4 key购买 nike

这是我的示例代码,用于检查类中是否存在给定属性。

class EmpDict:
def __init__(self, data):
self.data = data
try:
self.first_name = data['first_name']
self.age = data['age']
self.last_name = data['last_month']
except:
pass

def is_attr_available(self, attr):
try:
hasattr(EmpDict, attr)
return True
except:
return False

这是测试:

>> emp = {'first_name' : 'Tom', 'last_name' : 'Jose'}

>> a = EmpDict(emp)
>> print(a.is_attr_available(a.first_name))
True
>> print(a.is_attr_available(a.age))
print(a.is_attr_available(a.age))
AttributeError: 'EmpDict' object has no attribute 'age'

我期望最后一条语句为 False,但我得到了一个 AttributeError,即使我也在 is_attribute_available 方法中捕获了异常。

关于我在这里做错了什么的任何线索?

最佳答案

这不是您使用 hasattr 的方式。

首先,当您将属性名称作为字符串值时,您使用 hasattr:

attrname = 'age'
hasattr(a, attrname)

您不能将 a.age 传递给它——它已经在尝试查找 a.age,然后将其结果作为属性名称传递。如果有年龄,那将是错误的(因为你没有名为 23 的属性),如果没有,它甚至不会到达 hasattr一个。


但是您的代码还有另外两个问题。

首先,如果属性存在,hasattr 返回 True,否则返回 False。仅当您的代码中存在拼写错误或您的类中存在严重错误(并且您不希望 except: 捕获这些错误并使问题无法调试)时,它才会引发异常。

其次,EmpDict是类。该类没有任何这些属性,因此它总是会返回 false。您想知道 实例 self 是否有它们。

所以:

def is_attr_available(self, attr):
return hasattr(self, attr)

然后,您可以更改您的代码以调用

print(a.is_attr_available('age'))

但说真的,你为什么要这个功能?为什么不只是:

  • 尝试: a.age?
  • … 或提供一个默认值,例如 None,以便该属性始终存在?

关于python - hasattr 即使在捕获到异常后也返回属性错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51796037/

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