В Python 3.7+ теперь вы можете использовать классы данных для легкого создания хеш-классов.
Код
Предположим, int
типыleft
и right
, мы используем хеширование по умолчанию с помощью ключевого слова unsafe_hash
+ :
import dataclasses as dc
@dc.dataclass(unsafe_hash=True)
class Edge:
left: int
right: int
hash(Edge(1, 2))
# 3713081631934410656
Теперь мы можем использовать эти (изменяемые) объектные объекты в качестве элементов вустановить или (вводить в поле).
{Edge(1, 2), Edge(1, 2), Edge(2, 1), Edge(2, 3)}
# {Edge(left=1, right=2), Edge(left=2, right=1), Edge(left=2, right=3)}
Подробности
Мы можем альтернативно переопределить функцию __hash__
:
@dc.dataclass
class Edge:
left: int
right: int
def __post_init__(self):
# Add custom hashing function here
self._hash = hash((self.left, self.right)) # emulates default
def __hash__(self):
return self._hash
hash(Edge(1, 2))
# 3713081631934410656
Расширяя комментарий @ ShadowRanger, пользовательская хеш-функция OP ненадежна.В частности, значения атрибутов можно поменять местами, например, hash(Edge(1, 2)) == hash(Edge(2, 1))
, что, скорее всего, не то, что предназначено.
+ Обратите внимание, что имя «unsafe» предполагает использование хэша по умолчанию, несмотря на то, что объект изменчив.Это может быть нежелательно, особенно в ожидании неизменных ключей.Неизменное хеширование можно включить с помощью соответствующих ключевых слов.См. Также подробнее о логике хеширования в классах данных и о проблеме .