考虑以下代码:
#!/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
manifestl根据其所有实例变量计算其哈希值
其中一个是一套。但是,当我发现这一点时,
很难追踪。
所以,我的问题是,为什么错误消息显示此内容?应该是
不是TypeError: unhashable type: 'Person'
。为什么
追溯不是来自Python的肠道,
错误实际上是。
答案 0 :(得分:0)
NamedTuple
基于tuple
类。参见collections.namedtuple()
tuple
的哈希是所有元素的组合哈希。参见tupleobject.c
由于set
无法散列,因此无法对包含tuple
的{{1}}或NamedTuple
进行散列。
由于集合的哈希是在C语言中实现的,因此您看不到追溯