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

时间:2019-02-23 23:56:50

标签: python python-3.x

我写了以下课程的一部分:

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吗?

1 个答案:

答案 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
相关问题