2012-11-22 4 views
3

클래스 A을 정의한다고 가정하고 누군가가 멀리 가지 않고 해당 클래스의 부등식을 작성하는 것을 원하지 않습니다.NotImplemented가 TypeError를 발생시키지 않는 이유는 무엇입니까?

class A(): 
    def __ne__(self, other): 
     return NotImplemented 
print(A() != A()) 

는하지만이 True를 출력 내가 의도적으로 != 연산자를 "꺼져"하고 있지만 TypeError를 제기하지 않는 이유는 무엇입니까? 당신이 반환 예외이기 때문에

답변

8

:

그래서 당신이처럼 보이는 방법이 있어야합니다.

일반적으로 파이썬은 피연산자를 교환합니다. a != bNotImplemented 인 경우 b != a을 대신 시도합니다. 연산자의 양쪽에서 같은 유형을 사용하기 때문에 여기에서도 오류가 발생합니다. != 연산자의 경우, 파이썬은 메모리 주소를 비교하는 것으로 돌아가며, 두 개의 인스턴스가 같지 않으므로 False가 반환됩니다.

do_richcompare C function for details을 참조하십시오.

예상 결과라면 TypeError()을 수동으로 올려야합니다.

+0

3.x 풍부한 비교 구현의 단순함은 환영할만한 구제입니다. 2.x에서'__ne__'을 두 번 호출하는 대신 Python은 6 번 ('slot_tp_richcompare'가'PyObject_RichCompare'에 의해 호출 될 때 두 번,'try_rich_compare'가 정상적으로 그리고 스왑 된 순서로 시도 될 때 4 번 더) 호출합니다. 마침내'default_3way_compare'에서 포인터 비교를하고, 순서를 지원하기 위해'uintptr_t'로 형변환하면됩니다. – eryksun

+0

그래, 나는이 질문에'python-3.x' 태그를보기 위해 상당히 안도했다. 이 모든 것이 파이썬 2에서 어떻게 작동하는지에 대해 자세하게 살펴보면 약간 더 긴 대답이 될 것입니다. 그러나 LR, RL, RL, LR (왼손 및 오른손 인스턴스) 순서대로'A()! = A() '에 대해 * 4 * 호출 만'__ne__ '으로 계산합니다. –

-2

은 그것은 그것을를 제기하지 , 당신은 진정한 제공합니다. 즉, 테스트 결과로 Null 이외의 객체 (예외)를 반환하고 있음을 의미합니다. Non-Null 개체는 달리 지정하지 않는 한 True로 평가됩니다. 예외를 제기 할 때까지 예외가 일반적인 개체임을 기억하십시오. 당신은 당신이 True 또는 False을 반환해야__ne__ 경우 당신이 모르는 않는 것을 나타냅니다 NotImplemented을 반환 할 때

class A(): 
    def __ne__(self, other): 
     raise NotImplementedError 
+2

아니요, 예외는 아닙니다. ['__ne__'] (http://docs.python.org/3/reference/datamodel.html#object.__ne__)에 대한 설명서를 읽으십시오. 이 목적을위한 싱글 톤입니다. –

+0

사실, 예외에 대해 생각하고있었습니다. 저를 잘못 이해하지 마십시오. 그러나 NotImplemented의 bool()이 True를 반환하고 어떠한 종류의 의미있는 오류도주지 않으므로 문서에 이러한 결함이 있습니다. 그래서, 정확한 절차는 OP의 의도에서 적어도 예외를 제기하는 것입니다 (이해할 수있는 한) – EnricoGiampieri

+0

아니요, 'NotImplemented'는 매우 유용한 센티널 값입니다. 즉, 거기에 있음을 나타내는 값입니다 무언가를 구현 한 것이 아닙니다.) – delnan

관련 문제