4

考虑以下代码:

#!/usr/bin/env python3.7

from typing import NamedTuple, Set

class Person(NamedTuple):
    name: str
    fred: Set[str]


p = Person("Phil", set())
print(p)

my_dict = {}
my_dict[p] = 10


print(my_dict)

产生此错误

Traceback (most recent call last):
  File "./temp.py", line 14, in <module>
    my_dict[p] = 10
TypeError: unhashable type: 'set'

在这种情况下,它是示例代码,我已经对其进行了很多简化,因此很容易看出错误来自哪里。typed.NamedTuple 显然是根据它的所有实例变量计算它的哈希值,其中一个是一个集合。然而,当我发现这一点时,追查起来很痛苦。

所以,我的问题是,为什么错误消息会显示这个?应该不是TypeError: unhashable type: 'Person'。以及为什么回溯不是来自错误实际所在的python内部。

4

1 回答 1

1

NamedTuple是基于tuple类的。看collections.namedtuple()

atuple的哈希是所有元素的组合哈希。看tupleobject.c

由于set是不可散列的,因此不可能散列 atupleNamedTuple包含 a set

而且由于集合的散列是在 C 中实现的,因此您看不到回溯

于 2019-03-28T18:27:24.910 回答