我写了以下课程的一部分:
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吗?
答案 0 :(得分:2)
您正在尝试调用x._is_hashable()
,其中x
是输入的元素。那是行不通的,因为那不是对任意对象的方法。
我猜它的意图是这样的:
if not something._is_hashable(x):
因此您可以递归地调用_is_hashable
类的something
实用程序。
请记住,这全是胡说八道。测试某项是否可哈希的正确方法是仅在必须对其进行哈希处理的上下文中使用它,或者进行预检查,请执行以下操作:
try:
hash(obj)
except TypeError:
# Not hashable
else:
# It's hashable