Dlaczego bool jest podklasą int?

84

Podczas przechowywania bool w memcached poprzez python-memcached zauważyłem, że jest on zwracany jako liczba całkowita. Sprawdzenie kodu biblioteki pokazało mi, że jest miejsce, w którym isinstance(val, int)zaznaczone jest oflagowanie wartości jako liczby całkowitej.

Przetestowałem to w powłoce Pythona i zauważyłem, co następuje:

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

Ale dlaczego dokładnie jest boolpodklasa int?

Ma to sens, ponieważ w zasadzie wartość logiczna jest wartością typu int, która może przyjmować tylko dwie wartości, ale wymaga znacznie mniej operacji / miejsca niż rzeczywista liczba całkowita (bez arytmetyki, tylko jeden bit miejsca w pamięci) ....

ThiefMaster
źródło
1
Warto zauważyć, że skoro w Pythonie wszystko jest obiektem, przy nakładzie pracy, który wymaga, praktycznie bezcelowe jest oszczędzanie miejsca poprzez boolzmniejszanie rozmiaru. Jeśli dbałeś o wykorzystanie pamięci, na początku używałbyś innego języka.
kindall

Odpowiedzi:

101

Z komentarza na http://www.peterbe.com/plog/bool-is-int

Jest to całkowicie logiczne, jeśli byłeś w pobliżu, gdy typ bool został dodany do Pythona (czasami około 2.2 lub 2.3).

Przed wprowadzeniem rzeczywistego typu bool 0 i 1 były oficjalną reprezentacją wartości prawdy, podobnie jak C89. Aby uniknąć niepotrzebnego łamania nieidealnego, ale działającego kodu, nowy typ bool musiał działać tak, jak 0 i 1. To wykracza poza zwykłą wartość rzeczywistą, ale wszystkie operacje integralne. Nikt nie zalecałby używania wyniku boolowskiego w kontekście liczbowym, ani też większość ludzi nie zaleca testowania równości w celu określenia wartości prawdy, nikt nie chciał na własnej skórze przekonać się, jak bardzo istniejący kod jest w ten sposób. Tak więc decyzja, aby Prawda i Fałsz były maskowane odpowiednio jako 1 i 0. To tylko historyczny artefakt ewolucji językowej.

To miłe wyjaśnienie należy do dman13.

Wielomian
źródło
2
Zauważ, że może to być historycznie prawda, ale idiomatycznie widzisz wiele miejsc, w sum([f(value) for value in values])których f(x)znajduje się jakiś rodzaj funkcji filtrującej i musisz zobaczyć, ile wartości przechodzi przez filtr.
Adam Smith
2
Osobiście wolałbym pisać sum(1 for value in values if f(value)), ale tak naprawdę widziałem szanowanych ludzi opowiadających się za operacjami numerycznymi na boolach.
Marius Gedminas
28

Zobacz PEP 285 - Dodawanie typu bool . Odpowiedni fragment:

6) Czy bool powinien dziedziczyć z int?

=> Tak.

W idealnym świecie bool może być lepiej zaimplementowany jako oddzielny typ liczb całkowitych, który wie, jak wykonywać arytmetykę w trybie mieszanym. Jednak dziedziczenie wartości bool z int ogromnie ułatwia implementację (częściowo dlatego, że cały kod C, który wywołuje PyInt_Check (), będzie nadal działał - zwraca to true dla podklas int).

Steven Rumbalski
źródło
0

Można również użyć helpdo sprawdzenia Boolwartości w konsoli:

help (prawda)

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
 |  

pomoc (fałsz)

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
samolot
źródło