2009-10-13 1 views
6

__eq__ 메소드를 만들고자하는 컬렉션 클래스에서 작업하고 있습니다. 그것은 내가 생각했던 것보다 더 미묘한 것으로 밝혀졌고 빌트인 컬렉션 클래스가 어떻게 작동하는지에 관해서 몇 가지 복잡한 점을 발견했습니다.컬렉션 클래스에 대한 __eq__ 메서드의 좋은 예는 무엇입니까?

나를 가장 도와주는 것이 좋은 예입니다. 표준 라이브러리 나 타사 라이브러리에서 순수 파이썬 구현이 __eq__ 방법으로 있습니까?

답변

1

"collections.py"를 살펴보십시오. 최신 버전 (버전 제어에서)은 __eq__을 사용하여 OrderedDict를 구현합니다. 또한 sets.py에 __eq__가 있습니다.

+0

고맙습니다. 나는 콜렉션이 C 언어로 구현되었다고 생각했다 ... –

+0

파이썬 2.5와 2.6에서는 C 확장 모듈이다. 2.7에서 (버전 관리에서) 그것은 deque와 defaultdiect를 C 확장 모듈 _collections에서 가져 오는 파이썬 모듈입니다. OrderedDict는 3.1에서 새로 추가되었으며 2.7로 역 추적되었습니다. –

7

부품이 어렵습니다. 부품은 간단한 위임이어야합니다.

def __eq__(self, other): 
    if len(self) != len(other): 
     # Can we continue? If so, what rule applies? Pad shorter? Truncate longer? 
    else: 
     return all(self[i] == other[i] for i in range(len(self))) 
+0

시도해 보았습니다.하지만 여기에는 몇 가지 뉘앙스가 있습니다. 예를 들어, 다음은 False를 비교합니다 :'(1,2,3) == [1,2,3]'. 그래서 내가 모범 사례와 그 밖의 모든 것들에 대해 확실히 알고 있는지 예를 원했습니다. –

+0

(1,2,3)은 다른 유형이므로 [1,2,3]과 동일하지 않습니다. 어떤 타입 강제 변환 규칙을 적용해야한다고 생각합니까? 그것은 꽤 복잡합니다. 그것은 "더 일반적인"유형입니까? –

+0

집합과 같이 모든 컬렉션이 인덱싱 가능한 것은 아니며 같은 컬렉션에 동일한 순서로 항목이있을 것이라는 보장이 없습니다. – PaulMcG