[python] NotImplementedError를 발생시키는 대신 NotImplemented를 반환하는 이유

파이썬에는이라는 싱글 톤이 NotImplemented있습니다.

왜 누군가 NotImplementedNotImplementedError예외 를 제기하지 않고 돌아오고 싶 습니까? 잘못된 메소드를 실행하는 코드와 같은 버그를 찾기가 더 어려워지지 않습니까?



답변

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

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

해당 링크를 요약하면 다음과 같습니다.

NotImplemented이 작업을 충족하기 위해 다른 사람을 요청해야하는 런타임에 신호. 발현은 a == b, 경우에 a.__eq__(b)반환 NotImplemented, 다음 파이썬 시도 b.__eq__(a). 경우 b반환 충분히 알고 True또는 False그 표현이 성공할 수. 만약 그렇다면하지, 다음 런타임 것 다시 가을 내장 (대한 정체성을 기반으로 행동 ==하고 !=). “


답변

사용 사례가 다르기 때문입니다.

문서 인용 (Python 3.6) :

구현되지 않음

(예를 들면 진 특별한 방법에 의해 반환되는 __eq__(),
__lt__(), __add__(), __rsub__(), 등)의 동작은 다른 유형에 대하여 구현되지 않는다는 것을 나타내도록

예외 NotImplementedError

[…] 사용자 정의 기본 클래스에서 추상 메소드는 메소드를 대체하기 위해 파생 클래스가 필요할 때 또는 실제 구현을 계속 추가해야 함을 나타 내기 위해 클래스를 개발하는 동안이 예외를 발생시켜야합니다.

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


답변

한 가지 이유는 성능입니다. 짧은 시간에 많은 작업을 수행 할 수있는 풍부한 비교와 같은 상황에서는 많은 예외를 설정하고 처리하는 것이 단순히 NotImplemented값을 반환하는 것보다 훨씬 오래 걸릴 수 있습니다 .


답변