2009-05-18 2 views

답변

184

왜냐하면 __lt__() 및 관련 비교 방법은 목록 정렬 등에서 간접적으로 사용되기 때문입니다. 때때로 알고리즘은 다른 방법을 시도하거나 기본 승자를 선택합니다. 잡히지 않는 한 예외를 발생 시키면 예외가 발생하지만 NotImplemented은 발생하지 않으며 이후 테스트에 사용될 수 있습니다.

http://jcalderone.livejournal.com/32837.html

은 링크를 요약하면 :.이 작업을 충족하기 위해 다른 사람을 요청해야 런타임에

"NotImplemented 신호를 표현 a == b에서 a.__eq__(b) 반환 NotImplemented 다음 파이썬 시도하는 경우 b.__eq__(a)bTrue 또는 False을 반환하는 것으로 충분하다면 표현식은 성공할 수 있고 그렇지 않으면 런타임은 iden을 기반으로하는 내장 된 동작으로 되돌아갑니다 ==!=)

+4

이 링크는 문서의 끝 부분을 가리 키므로주의해서 사용합니다. –

+8

파이썬 인터프리터가'a .__ eq __ (b)'가 NotImplemented를 리턴했는지를 검사 할 때 NotImplementedError를 쉽게 잡아낼 수 없으며 ('b .__ eq __ (a)'또는 무엇이든) 호출 할 수 없습니까? – Veky

+11

@Veky. 예외를 발생 시키면 아마도 오버 헤드가 높아집니다. 정렬 작업의 오버 헤드는 목록 크기만큼 확대되므로 차이가 매우 작더라도 더 빠른 구현을 찾는 것이 좋습니다. 또한 try/catch 구현에 필요한 루프를 빠져 나가 재진입하고 싶지 않을 수도 있습니다. – SpliFF

9

하나의 이유는 성능입니다. 많은 비교 작업과 같은 상황에서 짧은 시간에 많은 작업을 수행 할 수있는 곳에서 많은 설정과 처리는 단순히 NotImplemented 값을 반환하는 것보다 훨씬 오래 걸릴 수 있습니다.

-4

예외 및 기능을 발생시키는 함수가 있는데, return NotImplemented은 후자의 경우 일 수 있습니다. 프로그래머/디자인에 따라 달라집니다. 그것이 그들이 사용하기 위해 둘 다있는 이유입니다.

+14

The Zen of Python ('>>> import this')을 검토하십시오. 13 행에 특별한주의를 기울이십시오. "할 수있는 한 가지 방법, 바람직하게는 단지 하나의 방법 만 있어야합니다." 파이썬은 Ruby 나 Perl 또는 수십 가지의 똑같이 유효한 방법이있는 다른 언어가 아닙니다. 대답은 프로그래머의 취향에 달려 있다는 것이 아닙니다. – ArtOfWarfare

18

서로 다른 유스 케이스가 있기 때문에.

인용 워드 프로세서 (파이썬 3.6) :

NotImplemented

(예 : __eq__(), __lt__(), __add__(), __rsub__() 등)를 표시하기 위해 바이너리 특별한 방법으로 반환해야 그 조작이 다른 유형에 대해 구현되지 않았다는 것

exception NotImplementedError

[...] 그들은 클래스가 을 나타내도록 개발하는 동안 방법을 재정의하거나 파생 클래스 필요할 때, 사용자 정의 기준 클래스에서 추상 방법이 예외를 제기해야 실제 구현에는 여전히 이 추가되어야합니다.

자세한 내용은 링크를 참조하십시오.

관련 문제