code

파이썬에서 좋은 __hash__ 함수를 구현하는 방법

starcafe 2023. 7. 22. 10:19
반응형

파이썬에서 좋은 __hash__ 함수를 구현하는 방법

아래 장난감 예제와 같이 여러 속성을 가진 클래스를 구현할 때 해싱을 처리하는 가장 좋은 방법은 무엇입니까?

내 생각에 그것은__eq__그리고.__hash__일관성이 있어야 하지만 모든 속성을 처리할 수 있는 적절한 해시 함수를 구현하는 방법은 무엇입니까?

class AClass:
  def __init__(self):
      self.a = None
      self.b = None

  def __eq__(self, other):
      return other and self.a == other.a and self.b == other.b

  def __ne__(self, other):
    return not self.__eq__(other)

  def __hash__(self):
      return hash((self.a, self.b))

는 이 질문에서 튜플은 해시 가능하다고 읽었는데, 위의 예시와 같은 것이 합리적인지 궁금합니다.그런가요?

__hash__동일한 개체에 대해 동일한 값을 반환해야 합니다.또한 개체의 수명 동안 변경되어서는 안 됩니다. 일반적으로 불변 개체에 대해서만 구현합니다.

간단한 구현은 다음과 같습니다.return 0이 방법은 항상 올바르지만 성능이 저하됩니다.

여러 속성의 해시를 반환하는 솔루션이 좋습니다.그러나 비교하는 모든 속성을 나열할 필요는 없습니다.__eq__태플로일반적으로 일부 속성이 부등식 객체에 대해 동일한 값을 갖는 경우에는 제외합니다.해시 계산을 필요 이상으로 비싸게 하지 마십시오.

편집: x 또는 일반적으로 해시를 혼합하지 않는 것이 좋습니다.서로 다른 두 속성의 값이 동일하면 해시가 동일하고 x 또는 x를 사용하면 서로가 취소됩니다.튜플은 해시를 혼합하기 위해 더 복잡한 계산을 사용합니다. 참조tuplehash…에

다음에 대한 설명서

필요한 유일한 속성은 동일한 해시 값을 비교하는 개체입니다. 개체와 비교하여 역할을 하는 개체 구성 요소의 해시 값을 태플로 패킹하고 태플을 해싱하여 함께 혼합하는 것이 좋습니다.

def __hash__(self):
    return hash((self.name, self.nick, self.color))

글을 쓰는 것은 위험합니다.

def __eq__(self, other):
  return other and self.a == other.a and self.b == other.b

왜냐하면 당신의 rh가 (즉,other) 객체는 부울 False로 평가되며, 절대로 어떤 것과도 동일하게 비교되지 않습니다!

추가로, 당신은 다음의 경우를 다시 확인하는 것이 좋습니다.other의 클래스 또는 하위 클래스에 속합니다.AClass그렇지 않으면 예외가 발생합니다.AttributeError또는 잘못된 양수(다른 클래스에 일치하는 값을 가진 동일한 이름의 속성이 있는 경우).그래서 다시 쓰는 것을 추천합니다.__eq__다음과 같이:

def __eq__(self, other):
  return isinstance(other, self.__class__) and self.a == other.a and self.b == other.b

하는 한 이 없는 비교를 , 속성이로일간클없한비비관는에스으로적유다좋니래습것연사이않경는지하용최원비한도소에우는하한교를련이름별치이정는교하상하는▁least▁avoid▁if▁▁to▁at▁compar▁as▁flexibleison,▁you▁still▁unusually▁classes'다니습좋속dutes▁match▁an,▁which▁compares▁unrelated▁across성▁by▁want▁by것▁you이▁chance않는▁any이▁long▁name▁attrib▁as지름이별로하사용치래AttributeError그리고 그것을 확인합니다.other추가 속성이 없습니다.개체의 모든 속성을 찾는 표준 방법이 없기 때문에 상황에 따라 방법이 달라집니다.

언급URL : https://stackoverflow.com/questions/4005318/how-to-implement-a-good-hash-function-in-python

반응형