Warum ist bool eine Unterklasse von int?

82

Beim Speichern eines Bools in Memcached über Python-Memcached habe ich festgestellt, dass es als Ganzzahl zurückgegeben wird. Das Überprüfen des Codes der Bibliothek hat mir gezeigt, dass es einen Ort isinstance(val, int)gibt, an dem überprüft wird, um den Wert als Ganzzahl zu kennzeichnen.

Also habe ich es in der Python-Shell getestet und Folgendes festgestellt:

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

Aber warum genau ist booleine Unterklasse von int?

Das macht irgendwie Sinn, weil ein Boolescher Wert im Grunde genommen ein int ist, das nur zwei Werte annehmen kann, aber viel weniger Operationen / Speicherplatz benötigt als eine tatsächliche Ganzzahl (keine Arithmetik, nur ein einziges Bit Speicherplatz) ....

DiebMaster
quelle
1
Es ist erwähnenswert, dass es in Python ziemlich sinnlos ist, Platz zu sparen, indem man bools verkleinert , da in Python alles ein Objekt ist . Wenn Sie sich für die Speichernutzung interessieren, verwenden Sie zunächst eine andere Sprache.
Kindall

Antworten:

97

Aus einem Kommentar auf http://www.peterbe.com/plog/bool-is-int

Es ist völlig logisch, wenn Sie in der Nähe waren, als der Bool-Typ zu Python hinzugefügt wurde (irgendwann um 2.2 oder 2.3).

Vor der Einführung eines tatsächlichen Bool-Typs waren 0 und 1 die offizielle Darstellung für den Wahrheitswert, ähnlich wie bei C89. Um zu vermeiden, dass nicht idealer, aber funktionierender Code unnötig beschädigt wird, muss der neue Bool-Typ genau wie 0 und 1 funktionieren. Dies geht über den bloßen Wahrheitswert, aber alle integralen Operationen hinaus. Niemand würde empfehlen, ein boolesches Ergebnis in einem numerischen Kontext zu verwenden, und die meisten Leute würden auch nicht empfehlen, die Gleichheit zu testen, um den Wahrheitswert zu bestimmen. Niemand wollte auf die harte Tour herausfinden, wie viel vorhandener Code auf diese Weise vorhanden ist. Daher die Entscheidung, True und False als 1 bzw. 0 zu maskieren. Dies ist lediglich ein historisches Artefakt der sprachlichen Entwicklung.

Dank geht an dman13 für diese nette Erklärung.

Polynom
quelle
49
Amüsanterweise ist dies meine am höchsten bewertete Antwort auf StackExchange, obwohl ich in meinem Leben noch nie eine Python-Zeile geschrieben habe!
Polynom
39
(nicht mehr wahr - Python macht Spaß!)
Polynom
2
Beachten Sie, dass dies historisch gesehen wahr sein kann, aber idiomatisch sehen Sie viele Stellen, an sum([f(value) for value in values])denen f(x)sich eine Art Filterfunktion befindet, und Sie müssen sehen, wie viele Werte den Filter passieren.
Adam Smith
2
Persönlich würde ich lieber schreiben sum(1 for value in values if f(value)), aber ich habe tatsächlich angesehene Leute gesehen, die sich für numerische Operationen an Bools einsetzen.
Marius Gedminas
26

Siehe PEP 285 - Hinzufügen eines Bool-Typs . Relevent Passage:

6) Sollte bool von int erben?

=> Ja.

In einer idealen Welt könnte Bool besser als separater Integer-Typ implementiert werden, der weiß, wie man Arithmetik im gemischten Modus ausführt. Das Erben von bool von int erleichtert jedoch die Implementierung enorm (teilweise, da der gesamte C-Code, der PyInt_Check () aufruft, weiterhin funktioniert - dies gibt true für Unterklassen von int zurück).

Steven Rumbalski
quelle
0

Kann auch verwendet werden help, um den BoolWert von in der Konsole zu überprüfen :

Hilfe (wahr)

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
 |  

Hilfe (falsch)

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
Flugzeug
quelle