Perché bool una sottoclasse di int?

Quando la memorizzazione di un valore booleano in memcached attraverso python-memcached ho notato che è tornato come un intero. Verifica il codice della libreria mi ha mostrato che c’è un posto dove isinstance(val, int) è controllato per bandiera il valore come numero intero.

Così ho provato la shell di python e ho notato il seguente:

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

Ma perché è esattamente bool una sottoclasse di int?

Si ha un senso perché è un booleano, fondamentalmente, è un int che si può semplicemente prendere due valori, ma ha bisogno di molto meno operazioni/spazio di un intero (non l’aritmetica, di un solo bit di spazio di archiviazione)….

  • Qui Alex Martelli assumere una domanda relativa a.
  • Vale la pena notare che, dal momento in Python, tutto è un oggetto, con il sovraccarico che impiega, è praticamente inutile tentare di risparmiare spazio, facendo bools più piccoli. Se si cura sull’uso della memoria, si sarebbe utilizzando un linguaggio diverso per iniziare con.

 

3 Replies
  1. 93

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

    È perfettamente logico che, se siete stati in giro quando il tipo bool era
    aggiunto a python (intorno al 2.2 o 2.3).

    Prima dell’introduzione di un vero e proprio tipo bool, 0 e 1 sono stati il
    ufficiale di rappresentanza valore di verità, simile a C89. Per evitare
    inutilmente di rottura non è l’ideale, ma codice di lavoro, il nuovo tipo bool
    necessarie per lavorare come 0 e 1. Questo va oltre il semplice valore di verità,
    ma tutte integrale operazioni. Nessuno si consiglia di utilizzare un valore booleano
    risultato in un contesto numerico, né la maggior parte delle persone consiglia di provare
    parità per determinare il valore di verità, nessuno voleva scoprire il duro
    modo a quanto il codice esistente è in questo modo. Quindi la decisione di fare
    Il vero e il Falso mascherarsi come 1 e 0, rispettivamente. Questo è solo un
    reperto storico dell’evoluzione linguistica.

    Credito va a dman13 per questa bella spiegazione.

    • Divertente, questo è il mio più alto votato risposta su StackExchange, nonostante a me non aver mai scritto una riga di Python in vita mia!
    • (non è più vero – Python è divertente!)
    • Si noti che questo potrebbe essere storicamente vero, ma idiomatico si vede un sacco di sum([f(value) for value in values]) dove f(x) è una sorta di funzione di filtro e devi vedere quanti valori di passare il filtro.
    • Personalmente preferisco scrivere sum(1 for value in values if f(value)), ma in realtà ho visto rispettati avvocato in favore di calcoli numerici su bools.
  2. 25

    Vedere PEP 285 — Aggiunta di un tipo bool. Rilevante passaggio:

    6) Dovrebbe bool ereditare da int?

    => Sì.

    In un mondo ideale, bool potrebbe essere meglio implementato come un
    separata di tipo integer che sa come eseguire in modalità mista
    l’aritmetica. Tuttavia, ereditando da int bool facilita l’
    attuazione enormemente (in parte, dal momento che tutti C codice che chiama
    PyInt_Check() continuerà a lavorare — restituisce true per
    sottoclassi di int).

  3. 0

    Inoltre possibile utilizzare help per verificare il Bool‘s valore in 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(False)

    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

Lascia un commento