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
是基于tuple
class。参见 collections.namedtuple()
tuple
的散列是所有元素的组合散列。参见 tupleobject.c
由于 set
不可散列,因此无法对包含 set
.
的 tuple
或 NamedTuple
进行散列
并且由于集合的散列是在 C 中实现的,所以您看不到回溯
考虑以下代码:
#!/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
是基于tuple
class。参见 collections.namedtuple()
tuple
的散列是所有元素的组合散列。参见 tupleobject.c
由于 set
不可散列,因此无法对包含 set
.
tuple
或 NamedTuple
进行散列
并且由于集合的散列是在 C 中实现的,所以您看不到回溯