2016-11-04 1 views
23

bool에 직접 구현되지 않았습니다.True <2 구현 방법은 무엇입니까?

>>> True.__lt__(2) 
AttributeError: 'bool' object has no attribute '__lt__' 

그리고 그것은 분명히 구현 아니에요 int 중 하나

>>> super(bool, True).__lt__(2) 
AttributeError: 'super' object has no attribute '__lt__' 

이 동작을 제어 할 수 2에 대한 __lt__ 전혀 반영 버전 없으며, int 유형 bool의 서브 클래스가 아니기 때문에 그 않을 것 어쨌든 작동합니다.

파이썬 3는 예상대로 동작 :

>>> True.__lt__(2) 
True 

그래서, 어떻게 True < 2 파이썬 2에서 구현? 기본적 FalseTrue 펑키 repr()의 0 내지 1이다 :

+0

암시 적으로 정수를 통해 변환 할 수 있습니까? – Carcigenicate

+0

당신은이 트릭을 쉽게 발견 할 수 있습니다.'[exprFalse, exprTrue] [condition]'은'exprTrue if else else exprFalse'와 같습니다. – BlackBear

+3

@BlackBear 둘 다를 평가한다는 것만 제외하면. 조건이 다른 경우 print ("False")'vs'[print ("False"), print ("True")] [condition]'print ("True"). – immibis

답변

51

Trueint의 서브이고 bool (그 2 이상의 이유 임) 파이썬 1과 동일하다.

비교가 정수로 구현되는 방법에 관해서는 파이썬은 구식 비교 방법 인 파이썬에서 __cmp__()을 사용합니다. (파이썬 3. 그것이이 __lt__()로 구현 왜 인 __cmp__()를 지원하지 않습니다) int 그것은 int.__cmp__의 파이썬 2. 풍부한 비교하는 대신 기존 __cmp__ 방법을 사용하기 때문에 당신은 super(bool, True).__lt__를 찾지 못했습니다 https://docs.python.org/2/reference/datamodel.html#object.__cmp__

+2

아, 맞습니다. 나는 ol ''__cmp__'에 대해 잊어 버렸습니다. 감사! – wim

0

True는, 구체적으로는 1 식 True < 21 < 2 같다 int 값 타입의 객체를 참조하는 단지 이름이다. 예를 들어, False은 0과 같습니다. 파이썬 2에서는 값이 같으면 0을 반환하고, 다른 값보다 너무 큰 값이 1이면 -1을 반환하고 다른 값보다 너무 작은 값이 1이면 -1을 반환합니다. 예 : <>의 등가물되는 __lt____gt__ 방법이 파이썬 3에서

>>> True.__cmp__(1) 
0 
>>> True.__cmp__(0) 
1 
>>> True.__cmp__(-1) 
1 
>>> True.__cmp__(0) 
1 
>>> True.__cmp__(1) 
0 
>>> True.__cmp__(2) 
-1 

.

+1

*'True'는'int' 타입의 객체를 참조하는 이름입니다. * - 맞지 않다고 생각합니다. 'True'의 타입은 bool입니다. int의 서브 클래스 서브 클래스는 원칙적으로'1 <2 '와는 다르게 동작하도록 True <2' 연산을 오버라이드 할 수 있습니다. – wim

관련 문제