파이썬에서 해시 가능한 객체

7493 단어 ooppython
Hash de objetos é uma Representativeação númerica inteira que é obtida utilizando o dunder method __hash__ . Compreender esse conceito ajuda a entender como as estruturas de dados Python funcionam, uma vez que o hash dos objetos são utilizados internamente.

Programadores Python costumam se deparar com o conceito de hash de objetos quando tentam armazenar um objeto sem hash em uma estrutura de dados da linguagem. 예를 들면:

from dataclasses import dataclass

@dataclass
class Pessoa:
    nome: str
    cpf: str

p = Pessoa(nome="Ítalo Epifânio", cpf="1010101010")
pessoas = set()
pessoas.add(p)


O código acima define uma classe pessoa e um objeto p 티포 페소아를 하세요. Ao tentar adicionar uma pessoa ao conjunto pessoas o seguinte erro é lançado:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'Pessoa'


이 작업은 Python을 활용하는 "conjunto"에 대한 결정을 내릴 수 있도록 합니다. 우리는 모든 사물을 해시하지 않고 오류가 있을 수 있습니다.

Para adicionar um hash a um object implementa-se as funções __hash__ e__eq__ 동시에 사용할 수 있습니다(Python 2는 기능 __ne__ 추가로 사용할 수 있습니다). Seguir modificamos nossa classe anterior para adquirir essa propriedade의 예는 없습니다.

@dataclass
class Pessoa:
    nome: str
    cpf: str

    def __hash__(self):
        return hash(self.cpf)

    def __eq__(self, other):
        mesma_classe = self.__class__ == other.__class__
        mesmo_cpf = self.cpf == other.cpf

        return mesma_classe and mesmo_cpf

p = Pessoa(nome="Ítalo Epifânio", cpf="101.010.101-01")
pessoas = set()
pessoas.add(p)


코드가 실행되는 곳은 전면에 있습니다. Se execuarmos print(pessoas) veremos que o conjunto contém o seguinte valor:

{Pessoa(nome='Ítalo Epifânio', cpf=1010101010)}


Um objeto é dito hashable se o valor de hash nunca é modificado durante sua fase de vida
-- Python Docs



Apenas implementar os dunder métodos acima não garante que o objeto é hashable. É preciso garantir o valor de hash desse objeto jamais sejá alterado pois isso pode levar a comportamentos não esperados, por exemplo:

p = Pessoa(nome="Ítalo Epifânio", cpf="101.010.101-01")
pessoas = set()
pessoas.add(p)
print(p in pessoas) # retorna True
p.cpf = "999.999.999-99"
print(p in pessoas) # retorna False
print(pessoas) # retorna {Pessoa(nome='Ítalo Epifânio', cpf='999.999.999-99')}


Ao alterar o cpf do objeto p note que o objeto não é mais encontrado na estrutura de dados conjunto (a segunda chamada do print(p in pessoas) retorna falso) e quando lista-se os valores do conjunto pessoas Nota-se que há ainda um valor lá.

이력서: você não pode basear hash de objetos em valores mutáveis. Se o atributo de um objeto pode ser modificado durante seu ciclo de vida comportamentos inesperados podem acontecer.

좋은 웹페이지 즐겨찾기