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


281

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

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

답변:


280

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

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

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

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


5
이 링크는 문서 끝 부분을 가리 키므로 조심스럽게 사용해야합니다.
Jason Coon

16
파이썬 인터프리터가 a.__eq__(b)NotImplemented를 반환 했는지 확인하면 NotImplementedError를 쉽게 잡을 수 없었 b.__eq__(a)습니까 (그리고 호출 하거나 그다음에 무엇이든)?
Veky

24
@ 비키. 예외를 발생 시키면 오버 헤드가 더 높아질 수 있습니다. 정렬 작업의 오버 헤드는 목록의 크기에 따라 확대되므로 차이가 매우 작더라도 더 빠른 구현을 찾는 것이 여전히 합리적입니다. 또한 루프에서 벗어나 try / catch 구현에 필요한 루프를 다시 입력하고 싶지 않습니다.
SpliFF

3
첫 번째로, 더 빠른 해결책은 항상 NotImplemented를 반환하는 것을 호출하는 대신 lt를 reverse gt로 자동 합성하는 것입니다. 파이썬은 그렇게하지 않습니다. 나는 속도가 이유라고 생각하지 않습니다. 그리고 두 번째로, 나는 당신이 말하는 것을 이해하지 못합니다 : 복귀는 루프만큼 많은 루프를 해제해야합니다. 실제로, 리턴은 호출 범위에서 항상 포착되는 특수 리턴 예외를 발생시키는 것으로 상상할 수 있습니다.
Veky

2
>> "목록의 크기로 확대"최소한 세계가 알아야 할 O (n) 정렬이 없으면 말입니다.
Jonathan Hartley

106

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

문서 인용 (Python 3.6) :

구현되지 않음

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

예외 NotImplementedError

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

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


13

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.