2016-11-04 21 views
23

Doğrudan boole uygulanmadı.Doğru <2 nasıl uygulanır?

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

Ve görünüşe göre uygulanan değil int ya:

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

Orada işleyişini kontrol etmek 2 için __lt__ hiçbir yansıyan sürümü ve int tip bool bir alt sınıfı olmadığından emin asla yine de çalış.

Python 3 beklendiği gibi davranır:

>>> True.__lt__(2) 
True 

Peki, nasıl True < 2 Python 2 uygulanıyor? Temel olarak, False ve True korkak repr() s 0 ve 1 'dir:

+0

Bir tam sayıya dolaylı olarak dönüştürebilir mi? – Carcigenicate

+0

Bu hileyi daha komik bulabilirsiniz: '[exprFalse, exprTrue] [koşul]', her ikisi de değerlendirmek dışında, koşul başka exprFalse' – BlackBear

+3

@BlackBear ise exprTrue öğesine eşdeğerdir. print ("False") 'vs' [print ("False"), baskı ("True")] [condition] '(başka bir deyişle yazdırma)" print ("True"). – immibis

cevap

51

Trueint bir alt sınıfıdır ve bool (bu 2 den aşağı neden olan) Python 1'e eşittir.

Tam sayılarda karşılaştırmanın nasıl uygulandığı konusunda Python, Python'daki eski okul yazma karşılaştırması olan __cmp__() kullanır. (Python 3. Orada __lt__() olarak uygulanır ki bu yüzden, __cmp__() desteklemez) int Bu int.__cmp__ var Python 2. zengin karşılaştırmaların yerine eski __cmp__ yöntemini kullanır çünkü super(bool, True).__lt__ bulamadık https://docs.python.org/2/reference/datamodel.html#object.__cmp__

+2

Ah, evet bu kadar. '__cmp__' hakkında unutmuştum. Teşekkürler! – wim

0

True, özellikle 1. Ekspresyon True < 21 < 2 eşittir değer tip int bir nesne anlamına gelmektedir adil bir isimdir. Aynı, False, 0'a eşittir. Python 2'de, __cmp__ yöntemine sahip olursunuz; bu, değerler eşitse 0 değerini döndürür, -1 değeri diğer değerden çok büyükse ve 1 değeri diğer değerden çok düşükse. Örnek: < ve > karşılıkları olan bir __lt__ ve __gt__ yöntemleri var Python 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

* "Doğru", "int" türünde bir nesneyi ifade eden bir addır * <- Doğru olduğunu düşünmüyorum, "True" türü bool. Int bir alt sınıfı Alt sınıf, prensip olarak, 'True <2' işleminin '1 <2''den farklı davranmasını geçersiz kılabilir. – wim