ExpertiDict

Python · Avançado · Português · Técnico

contrato de eq e hash

/kõ.ˈtɾa.tu dʒi ˈɛk i ˈɐʃ/substantivo

Regra de que objetos iguais devem ter o mesmo hash. Ao definir __eq__ sem __hash__, o Python marca a classe como não hashable, pois a regra deixaria de valer.

Onde usar

Aparece quando uma classe com __eq__ personalizado não entra em um set nem serve de chave de dicionário (unhashable type). A correção é definir __hash__ com os mesmos campos usados na igualdade.

Em código

class P:
  def __init__(self, x):
    self.x = x
  def __eq__(self, o):
    return self.x == o.x
  def __hash__(self):
    return hash(self.x)
print(len({P(1), P(1)}))

Exemplos

Defini o eq, então preciso definir o hash também.

Os dois objetos são iguais, mas têm hashes diferentes, o que quebra o contrato.

Cuidado

Não use campos mutáveis no hash: se o objeto mudar depois de entrar em um set, ele fica perdido na estrutura.

Veja também

Todos os termos de Python