NamedTuples、Hashable 和 Python

NamedTuples, Hashable and Python

考虑以下代码:

#!/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 某处的内部 错误实际上是。

NamedTuple是基于tupleclass。参见 collections.namedtuple()

tuple 的散列是所有元素的组合散列。参见 tupleobject.c

由于 set 不可散列,因此无法对包含 set.

tupleNamedTuple 进行散列

并且由于集合的散列是在 C 中实现的,所以您看不到回溯