Python · Avançado · Português · Técnico
contrato de eq e hash
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.