NamedTuples, Hashable и Python - PullRequest
       58

NamedTuples, Hashable и Python

2 голосов
/ 28 марта 2019

Рассмотрим следующий код:

#!/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'. И почему обратная связь не приходит из недр питона где-то, где ошибка на самом деле.

1 Ответ

0 голосов
/ 28 марта 2019

NamedTuple основано на классе tuple. См collections.namedtuple()

Хэш tuple - это объединенный хэш всех элементов. См tupleobject.c

Поскольку set не подлежит хэшированию, невозможно хэшировать tuple или NamedTuple, содержащие set.

И поскольку хеширование набора реализовано в C, вы не увидите трассировку

...