[Python] 0 in (False,) // 0 == False

Daniele Varrazzo piro a develer.com
Gio 4 Feb 2010 14:24:33 CET


On Thu, 4 Feb 2010 13:36:25 +0100, Alessandro Dentella <sandro a e-den.it>
wrote:
> On Thu, Feb 04, 2010 at 01:15:37PM +0100, Daniele Varrazzo wrote:
>> On Thu, 4 Feb 2010 10:26:40 +0100, Alessandro Dentella
<sandro a e-den.it>
>> wrote:
>> 
>> > Mi viene qui di da chiedermi: ma che bisogno c'è che un booleano
>> > erediti
>> > da
>> > un intero? piace a tutti che "0 == False" sia vero?
>> 
>> A me piace... e mi piace ancora di più che 1 == True! In questo modo un
>> ...

> Questo è avvincente come sostegno all'idea che il booleano si comporti
> comex
> un intero. Ne deriva necessariamente che 0 == False? Ovvero: il fatto
che
> *si comporti come un numero* nell operazioni richiede per necessità che
==
> dica che sono uguali?
> 
> Credo che la prima  parte delle parole di guido indichino di no:
> 
>       In an ideal world, bool might be better implemented as a separate
>       integer type that knows how to perform mixed-mode arithmetic

Mi sembra di capire che nel mondo ideale di Guido i bool sarebbero tipi
separati dagli int mentre nel fangoso mondo reale ne sono una sottoclasse.
Ma anche se fossero tipi interi separati, saprebbero effettuare operazioni
aritmetiche miste: questo vuol dire che comunque saresti in grado di fare
operazioni tipo int + bool. Ma sarebbe curioso se si potessero usare
operatori misti aritmetici ma non logici, non trovi? Io penso sarebbe una
limitazione artificiale. Avresti: implementazioni di int == int, di bool ==
bool ma non potresti usare int == bool. Proprio per la proprietà di
"trasparenza", per cui puoi facilmente scrivere codice in cui usare
indifferentemente int o bool come input booleani, questa sarebbe una
pericolosa asimmetria che porterebbe ad eccezioni misteriose.

È proprio necessario che false sia 0? Probabilmente no (per le shell, 0 è
true in contesto logico), ma in ogni caso, se puoi implementare operazioni
logiche miste, tipo bool == int, false *deve* essere uguale ad almeno un
intero: se False == X fosse sempre falso, vorrebbe dire che X è vero per
ogni intero X, quindi praticamente non puoi usare gli interi come valori
logici. Potevano scegliere -42 come False, ma cominceresti ad avere
inconsistenze tra come si comportano il not logico e il not binario
(operatore ~).

Se vuoi verificare che un oggetto X sia davvero False e non 0, usa "if X
is False" ;)

-- 
Daniele Varrazzo - Develer S.r.l. 
http://www.develer.com


Maggiori informazioni sulla lista Python