boolがintのサブクラスであるのはなぜですか?


84

python-memcachedを介してmemcachedにboolを格納すると、整数として返されることに気付きました。ライブラリのコードをisinstance(val, int)チェックすると、値を整数としてフラグを立てるためにチェックされる場所があることがわかりました。

だから私はそれをPythonシェルでテストし、次のことに気づきました:

>>> isinstance(True, int)
True
>>> issubclass(bool, int)
True

しかし、なぜ正確にboolのサブクラスなのintですか?

ブール値は基本的に2つの値を取ることができるintですが、実際の整数よりもはるかに少ない操作/スペースで済みます(算術演算なし、ストレージスペースは1ビットのみ)。



1
Pythonでは、すべてがオブジェクトであり、オーバーヘッドが発生するため、boolsを小さくしてスペースを節約しようとしてもほとんど意味がないことに注意してください。メモリの使用を気にする場合は、最初に別の言語を使用することになります。
kindall 2011年

回答:


101

http://www.peterbe.com/plog/bool-is-intのコメントから

bool型がpythonに追加されたとき(2.2または2.3頃)であれば、それは完全に論理的です。

実際のブール型が導入される前は、C89と同様に、0と1が真理値の公式表現でした。理想的ではないが機能するコードを不必要に壊さないようにするために、新しいブール型は0と1のように機能する必要がありました。これは単なる真理値を超えていますが、すべての整数演算です。数値のコンテキストでブール結果を使用することを推奨する人は誰もいません。また、ほとんどの人が真理値を決定するために等式をテストすることを推奨しません。したがって、TrueとFalseをそれぞれ1と0に見せかけるという決定。これは、言語進化の歴史的成果物にすぎません。

この素晴らしい説明のためにクレジットはdman13に行きます。


2
これは歴史的に正しいかもしれませんが、慣例的sum([f(value) for value in values])f(x)は、ある種のフィルター関数がどこにあるかが多く、フィルターを通過する値の数を確認する必要があることに注意してください。
アダムスミス

2
個人的には書きたいのsum(1 for value in values if f(value))ですが、実際には、尊敬されている人々がブールの数値演算を支持しているのを見てきました。
Marius Gedminas 2016年

28

PEP285-ブール型の追加を参照してください。関連するパッセージ:

6)boolはintから継承する必要がありますか?

=>はい。

理想的な世界では、boolは、混合モード演算の実行方法を知っている別個の整数型として実装する方が適切な場合があります。ただし、intからboolを継承すると、実装が大幅に容易になります(PyInt_Check()を呼び出すすべてのCコードが引き続き機能するため、これはintのサブクラスに対してtrueを返します)。


0

コンソールでの値helpを確認するためにも使用できますBool

help(True)

help(True)
Help on bool object:
class bool(int)
 |  bool(x) -> bool
 |  
 |  Returns True when the argument x is true, False otherwise.
 |  The builtins True and False are the only two instances of the class bool.
 |  The class bool is a subclass of the class int, and cannot be subclassed.
 |  
 |  Method resolution order:
 |      bool
 |      int
 |      object
 |  

ヘルプ(偽)

help(False)
Help on bool object:
class bool(int)
 |  bool(x) -> bool
 |  
 |  Returns True when the argument x is true, False otherwise.
 |  The builtins True and False are the only two instances of the class bool.
 |  The class bool is a subclass of the class int, and cannot be subclassed.
 |  
 |  Method resolution order:
 |      bool
 |      int
 |      object
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.