NamedTuples,Hashable和Python

时间:2019-03-28 15:54:36

标签: python namedtuple hashable typed

考虑以下代码:

#!/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的肠道, 错误实际上是。

1 个答案:

答案 0 :(得分:0)

NamedTuple基于tuple类。参见collections.namedtuple()

tuple的哈希是所有元素的组合哈希。参见tupleobject.c

由于set无法散列,因此无法对包含tuple的{​​{1}}或NamedTuple进行散列。

由于集合的哈希是在C语言中实现的,因此您看不到追溯