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

Enrico Franchi enrico.franchi a gmail.com
Sab 6 Feb 2010 23:03:48 CET


On Feb 5, 2010, at 8:24 PM, Alessandro Dentella wrote:

> in attesa che Enrico mantenga la
> promessa e mostri gli "assurdi completi" che quanto scritto sopra
> comporterebbe. 

Essenzialmente ha spiegato tutto già Daniele. Gli assurdi saltano fuori
dalla posizione:

 In an ideal world, bool might be better implemented as a
      separate integer type that knows how to perform mixed-mode
      arithmetic.

Ovvero noi *vogliamo* mixed mode arithmetic. Tolto questo assunto,
è ovviamente completamente possibile gestire in modo consistente
le operazioni fra interi e booleani lanciando eccezioni.

Il punto è che IMHO l'aritmetica che coinvolge i booleani è estremamente
comoda. Evidentemente anche secondo Guido. 

Quindi partiamo dal volere che un booleano possa stare in ogni posto 
dove possa stare un intero.

Consideriamo anche ragionevole che:

1) a + (-a) == a - a == 0

2) m - n < 0 <==> m < n


Ma soprattutto chiediamoci cosa *dovrebbe* fare

False + True o una cosa come

True * 5

è completamente chiaro che il tutto è relativamente arbitrario (in particolare
True == 5 invece che True == 1 non darebbe problemi).

Ma prendere False != da 0 ci porrebbe nell'imbarazzante condizione di avere

if 0: print "foo"

che stampa "foo". 


Comunque davvero, la cosa più naturale è vedere True e False come numeri a 1-bit.
Non ci formalizziamo perchè 0 == 0L, ma ci da fastidio False. 

Se vogliamo fare aritmetica mista (che è l'assunto), ci troviamo a dovere dare convenzionalmente
un valore a True e False. E ovviamente tutte le scelte possibili sarebbero peggiori e meno
intuitive di questa.







Maggiori informazioni sulla lista Python