2016-11-04 5 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のサブクラスではないので、それだろうとにかく仕事。

のPython 3は、期待通りに動作します。

>>> True.__lt__(2) 
True 

だから、どのようにTrue < 2は、Python 2に実装されていますか?

+0

整数への暗黙的な変換によって、おそらく? – Carcigenicate

+0

このトリックは面白いかもしれません: '[exprFalse、exprTrue] [condition]'は 'exprTrue if else else exprFalse'と同等です。 – BlackBear

+3

@BlackBearそれ以外は評価されません。 '' '' '' '' '' '' '' '' '' '' '' '' ''条件を満たしていれば '' True ''を返します。 – immibis

答えて

51

Trueは(それが2未満である理由である)Pythonで1に等しく、boolintのサブクラスである:基本的に、FalseTrueはファンキーrepr() S 0および1です。

比較が整数でどのように実装されるかに関しては、Pythonは古典的なPythonの比較記述方法である__cmp__()を使用しています。 (Pythonの3は、それがそこ__lt__()として実装されている理由である、__cmp__()をサポートしていません。)intではなく、Pythonの2の豊富な比較の遺産__cmp__方法を使用していますそれは、int.__cmp__だからあなたがsuper(bool, True).__lt__を見つけられませんでしたhttps://docs.python.org/2/reference/datamodel.html#object.__cmp__

+2

ああ、そうです。私はol ''__cmp__'を忘れてしまいました。ありがとう! – wim

0

Trueは、タイプintのオブジェクト、具体的には値1を参照する単なる名前です。式True < 2は、1 < 2と等しくなります。 Falseは0に等しい。Python 2では、値が等しい場合は0を返し、他の値よりも大きすぎる値の場合は-1を返し、他の値よりも小さすぎる場合は-1を返すメソッド__cmp__を持つ。例:あなたは<>の等価物である__lt____gt__メソッドを持っているの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

* 'True'は、' int'型のオブジェクトを参照する単なる名前です。* < - 私はそうは思わない、 'True'の型はboolです。 intのサブクラスです。サブクラスは、原則として、 '1 <2'とは異なる振る舞いをするために' True <2'演算をオーバーライドすることができます。 – wim

関連する問題