개발/Python

[파이썬] NotImplementedError 대신 NotImplemented를 반환하는 이유

MinorMan 2023. 1. 21. 22:44
반응형

<질문>

파이썬에는 다음과 같은 싱글톤이 있습니다.NotImplemented.

왜 누군가는 돌아가고 싶어할까요NotImplemented높이는 대신NotImplementedError예외? 잘못된 메서드를 실행하는 코드와 같은 버그를 찾는 것이 더 어려워지지 않을까요?


<답변1>

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

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

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

"NotImplemented는 다른 사람에게 작업을 충족하도록 요청해야 한다는 신호를 런타임에 보냅니다. 표현식 a == b에서 a.__eq__(b)가 NotImplemented를 반환하면 Python은 b.__eq__(a)를 시도합니다. b가 다음을 충분히 알고 있는 경우 True 또는 False를 반환하면 식이 성공할 수 있습니다. 그렇지 않은 경우 런타임은 기본 제공 동작(== 및 !=의 ID를 기반으로 함)으로 대체됩니다."


<답변2>

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

문서 인용(Python 3.6):

구현되지 않음

이진 특수 메서드(예: __eq__(), __lt__(), __add__(), __rsub__() 등)에 의해 반환되어 작업이 다른 유형과 관련하여 구현되지 않았음을 나타냅니다.

예외 NotImplementedError

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

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


<답변3>

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


<답변4>

귀국NotImplemented함수에 의한 것은 함수가 입력을 처리할 수 없다고 선언하는 것과 같지만 예외를 발생시키는 대신 제어가반사 기능Reflection Function이 입력을 처리할 수 있기를 바랍니다.

첫째,반사 기능모든 기능과 관련된 것은 미리 정의됩니다. 두 번째로 원래 함수가 반환될 때NotImplemented, 통역사는반사 기능하지만 에뒤집힌 순서입력 인수.

자세한 예시를 보실 수 있습니다here

반응형