Perché bool è una sottoclasse di int?


84

Durante la memorizzazione di un bool in memcached tramite python-memcached, ho notato che viene restituito come numero intero. Il controllo del codice della libreria mi ha mostrato che esiste un punto in cui isinstance(val, int)viene controllato per contrassegnare il valore come un numero intero.

Quindi l'ho testato nella shell python e ho notato quanto segue:

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

Ma perché è esattamente booluna sottoclasse di int?

Ha senso perché un booleano è fondamentalmente un int che può prendere solo due valori ma richiede molte meno operazioni / spazio rispetto a un numero intero effettivo (senza aritmetica, solo un singolo bit di spazio di archiviazione) ...


11
Ecco il punto di vista di Alex Martelli su una domanda correlata .
Sven Marnach

1
Vale la pena notare che poiché in Python tutto è un oggetto, con l'overhead che impiega, è praticamente inutile cercare di risparmiare spazio riducendo le booldimensioni. Se ti importasse dell'uso della memoria, useresti una lingua diversa per cominciare.
kindall

Risposte:


102

Da un commento su http://www.peterbe.com/plog/bool-is-int

È perfettamente logico, se eri in giro quando il tipo bool è stato aggiunto a python (a volte intorno a 2.2 o 2.3).

Prima dell'introduzione di un tipo bool effettivo, 0 e 1 erano la rappresentazione ufficiale del valore di verità, simile a C89. Per evitare di rompere inutilmente codice non ideale ma funzionante, il nuovo tipo bool doveva funzionare proprio come 0 e 1. Questo va oltre il semplice valore di verità, ma tutte le operazioni integrali. Nessuno consiglierebbe di utilizzare un risultato booleano in un contesto numerico, né la maggior parte delle persone consiglierebbe di testare l'uguaglianza per determinare il valore di verità, nessuno voleva scoprire nel modo più duro quanto codice esistente sia in quel modo. Da qui la decisione di fare in modo che True e False si mascherino rispettivamente come 1 e 0. Questo è semplicemente un artefatto storico dell'evoluzione linguistica.

Il merito va a dman13 per questa bella spiegazione.


2
Nota che questo potrebbe essere storicamente vero, ma idiomaticamente vedi molto sum([f(value) for value in values])dove si f(x)trova una sorta di funzione di filtro e devi vedere quanti valori passano il filtro.
Adam Smith

2
Personalmente preferirei scrivere sum(1 for value in values if f(value)), ma in realtà ho visto persone rispettate sostenere le operazioni numeriche sui bool.
Marius Gedminas

29

Vedere PEP 285 - Aggiunta di un tipo bool . Passaggio rilevante:

6) Bool dovrebbe ereditare da int?

=> Sì.

In un mondo ideale, bool potrebbe essere implementato meglio come un tipo intero separato che sa come eseguire operazioni aritmetiche in modalità mista. Tuttavia, ereditare bool da int semplifica enormemente l'implementazione (in parte poiché tutto il codice C che chiama PyInt_Check () continuerà a funzionare - questo restituisce true per le sottoclassi di int).


0

Può anche essere utilizzato helpper controllare il Boolvalore di nella console:

aiuto (vero)

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
 |  

aiuto (Falso)

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.