gpt4 book ai didi

python - 为什么我的代码会引发 AttributeError 而不是 ValueError

转载 作者:行者123 更新时间:2023-12-01 01:11:18 26 4
gpt4 key购买 nike

我编写了以下类(class)的部分内容:

class something(dict):

@staticmethod
def _is_hashable(obj):
if type(obj) == str:
return True
if not hasattr(obj, "__hash__") or getattr(obj, "__hash__") == None:
return False
if hasattr(obj, "__iter__"):
if len(obj) == 0:
return False
for x in obj:
if not x._is_hashable():
return False
return True


def __init__(self, initial=[], **kargs):
for k, v in kargs.items():
if self._is_hashable(k) and self._is_hashable(v):
pass
else:
raise ValueError
super().__init__(initial, **kargs)
self._rdict = {}

但是,当我测试时

b1 = something(a = ((),(),((),[])))

b1 = something(a = (1,2,{1:'a'}))

它引发 AttributeError 而不是 ValueError

当我这样做时

b1 = something(a = {1})

这确实会引发 ValueError。有人可以告诉我为什么以及如何更改我的代码以便上述所有示例都会引发 ValueError 吗?

最佳答案

您正在尝试调用 x._is_hashable(),其中 x 是您输入的元素。这是行不通的,因为这不是任意对象上的方法。

我猜其意图是这样的:

if not something._is_hashable(x):

因此,您递归调用 something 类的 _is_hashable 实用程序。

请注意,无论如何,这都是废话。测试某些内容是否可哈希的正确方法是在必须对其进行哈希的上下文中使用它,或者进行预检查,执行以下操作:

try:
hash(obj)
except TypeError:
# Not hashable
else:
# It's hashable

关于python - 为什么我的代码会引发 AttributeError 而不是 ValueError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54847441/

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