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

2010-02-12 Per discussione Enrico Franchi

On Feb 11, 2010, at 12:24 AM, Pietro Battiston wrote:

 Quando si parla di vantaggi concreti, preferisco farlo davanti a dati
 concreti.

Che sarebbero? 

 Ovviamente non intendevo che l'aritmetica possa esistere senza
 uguaglianza, ma che il simbolo = può essere definito ben a monte
 dell'aritmetica, in maniera vagamente simmetrica a quel che succede
 appunto nel Python.

Probabilmente diamo dunque un differente significato al concetto di
non avere niente a che fare. Comunque una volta che siamo in accordo,
tutto bene.

Poi ovviamente si, sono d'accordo che un uguaglianza possa stare a monte
dell'aritmetica (uguaglianza semantica, intendo, l'uguaglianza sintattica e' 
una bestia
ancora diversa).

Anche l'uguaglianza di python e', ovviamente potenzialmente semantica. Sebbene 
il default
di object sia la versione ad oggetti dell'uguaglianza sintattica, ovvero la 
completa identita', di fatto poi == e' ridefinito per vaste classi di oggetti. 
Suppongo che su sta roba siamo tutti d'accordo e non
sia necessario soffermarci oltre.

 Se le tue intuizioni informatiche sono azzeccate quanto quelle
 personali, non mi stupisce la confusione che fai parlandone.

Ottimo. Allora ci hai lavorato anche tu e dovresti essere piuttosto consapevole
del fatto che definire formalmente un metodo di un oggetto di un linguaggio
completamente dinamico sia un lavoraccio, visto che hai la *semantica* che
dipende dall'esecuzione, visto che quale codice venga chiamato da una data
chiamata di funzione (o anche solo da un accesso a membro) e' potenzialmente
non noto a compile time.

Anche immaginando un == scritto staticamente c' da fare un discreto lavoro
per formalizzare il tutto. E non credo che la cosa ci porti da nessuna parte,
ma se vuoi iniziare ti seguo e vediamo di metterla in piedi.

 
 (N.B: non risponderò in maniera polemica a parti della tua email che non
 siano gratuitamente polemiche. Anzi, facciamo che alle altre parti
 gratuitamente polemiche non rispondo proprio.)

Ottimo. A me risultava che la forte polemica fosse partita nel tuo messaggio,
posso ovviamente sbagliare. Se abbassiamo i toni sono completamente d'accordo.
Se trovi parti del mio nuovo messaggio che ritieni inutilmente polemiche, ti 
chiedo
scusa in anticipo e segnalamele. 

 La tua teoria secondo cui tutto deve necessariamente essere così com'è
 si poteva (almeno, mi ero figurato che si potesse) motivare dal punto di
 vista dell'eleganza matematica _o_ dell'attinenza alla mentalità
 pythonesca: se tu dici che la matematica non c'entra niente, tirala pure
 via, altrimenti vai fino in fondo e facciamo le cose bene, la
 precisione non è mai sgradevole.

Guarda, io sono una persona abbastanza pedante. Sono molto formale, a volte
pure troppo. Il motivo per cui vorrei lasciare perdere l'eleganza matematica e' 
che
spesso nel mondo pragmatico dei linguaggi di programmazione viene sacrificata
in molti punti e modi ben peggiori di questo. Il che vuole dire che appellarsi 
troppo
all'intuizione matematica non di rado porta fuori strada.

Di fatto sono pochissimi i linguaggi che non soffrono di questo problema, e a 
volte
sono parecchio scomodi proprio per questa ragione.

Io poi non sostengo che tutto debba essere come e'. Non ho parlato di tutto.
Ti ho anche indicato un punto che trovo sgradevole (e che fortunatamente 
hanno fixato in Python 3). Posso aggiungere che mi piacerebbe che Python potesse
essere tail recursive (anche se so perche' non PUO' esserlo). Etc etc etc.

Riguardo al problema specifico, abbiamo sempre sta cosa qua. O sacrifichi 
l'aritmetica
mista (e lanci eccezioni), oppure tieni le cose come sono, con False che si 
comporta
come 0.

Se ho capito bene, tu vorresti 0 != da False *ma* avendo aritmetica mista. E 
questo
IMHO non porta da nessuna parte. 

 Stai scherzando?! Questo punto è stato chiarito 6 mail fa.
 _Evidentemente_
 if 0: print ciao - ...
 if []: print ciao - ...


No, non sto scherzando. Continui a chiedermelo. Se stessi scherzando
proverei con delle barzellette. Se scrivo su un gruppo tecnico, è probabile
che non stia scherzando.

Probabilmente non ti piace il Python idiomatico.
Utilizzare cose come

if len([]) == 0:

sono considerate *cattiva* pratica. Proporre di abbandonare la pratica
considerata buona di

if []: 

IMHO non è particolarmente sensato.

 Veramente ho concluso che _potrebbero_ benissimo esserlo, e che io lo
 troverei più intuitivo - a prescindere dall'abitudine, ovviamente.

Potrebbero essere qualunque cosa. La praticità della cosa rimarrebbe 
discutibile, tuttavia.

 Non ne vedo affatto la ragione. Se dopo tutte queste mail ti sfugge
 ancora la semantica che ho in mente, te la rispiego: il comportamento
 dei bool rimane _ovunque_ quello che è, tranne che 0 != False (e
 ovviamente ottieni risultati diversi se vai a vedere l'ereditarietà).

Mi sfugge perche' non mi sembrava scritto nero su bianco. Anzi, mi 
sembra che altaleni fra NON ammettere l'aritmetica mista e ammetterla
ma con 0 != da False.

 Come si 

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

2010-02-11 Per discussione Raffaele Salmaso
[snip su tutto che francamente è quasi polemica pura]

Enrico Franchi wrote:
 Proporlo di cambiarlo
Scusa, ma in tutto questo giro devo essermelo perso questo passaggio.
Dove sarebbe?

 andando a toccare dei punti che a Guido piaccioni,
E amen, fin qui penso sia assodato che sia qualcosa che a Guido piaccia.

 è *evidentemente* improbabile.
A me non sembra che nessuno, e ripeto *nessuno*, abbia avuto voglia di
cambiare il comportamento di python. Ci si chiede solo il perché di una
scelta che a me francamente True + 1 == 2 fa rizzare i capelli come il
4 + 2 == 42 (o potrebbe benissimo anche essere 42, perché no?).

-- 
()_() | That said, I didn't actually _test_ my patch.  | +
(o.o) | That's what users are for! | +---+
'm m' |   (Linus Torvalds) |  O  |
(___) |  raffaele dot salmaso at gmail dot com |
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


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

2010-02-11 Per discussione Enrico Franchi

On Feb 11, 2010, at 9:23 AM, Raffaele Salmaso wrote:

 Proporlo di cambiarlo
 Scusa, ma in tutto questo giro devo essermelo perso questo passaggio.
 Dove sarebbe?

Scusa, ma con tutti questi snip proprio non riesco a capire a cosa ti riferisci
del mio messaggio. Non ho completamente voglia di grepparmelo per capire
a quale pezzo fai riferimento.

 A me non sembra che nessuno, e ripeto *nessuno*, abbia avuto voglia di
 cambiare il comportamento di python. Ci si chiede solo il perché di una
 scelta che a me francamente True + 1 == 2 fa rizzare i capelli come il
 4 + 2 == 42 (o potrebbe benissimo anche essere 42, perché no?).

Perche'? Direi che i linguaggi che fanno automaticamente conversione
stringa intero hanno su questa cosa un po' di casi ambigui. Inoltre
la conversione fra stringa e intero e' una conversione vera e propria, che
puo' dare errori e avere ambiguita'. Su questo penso siamo tutti d'accordo.

Da bool ad int invece si avrebbe quella che intermini C e' una *promozione*.
Non ci possono essere errori, non ci possono essere ambiguita'.

Poi, come piu' volte ho ripetuto, e' perfettamente lecito desiderare che 
mischiare
aritmetica intera e booleana lanci un'eccezione. Che e' l'altro comportamento
sensato oltre a quello attuale. IMHO rimane tuttavia molto meno comodo.

E soprattutto, tanto vale mettersi nell'ordine di idee di abbandonare codice 
come

if my_list: ...

perche' a quel punto sarebbe difficile sostenere che 0 non deve valutare a falso
quando e' un booleano mentre [] dovrebbe farlo. Se ricordo bene, e' stato detto 
chiaramente che non si vuole nemmeno

if 0:

anche se in questo caso la questione sarebbe piu' relativa a __nonzero__ che
al mischiare booleani e interi.

Il problema e' che in questa cosa si intrecciano due comportamenti diversi. Da
un lato il __nonzero__ che e' alla base delle liste e sequenze vuote, 
dall'altro avere aritmetica
mista con booleani, di conseguenza conversioni e tutta la combriccola.

Ora io sono disposto a pagare 0 == False per avere aritmetica con booleani. 
Evidentemente tu no. Il che e' lecito, puoi benissimo chiedere le eccezioni.
Ruby, che appunto sceglie che 0 != False fa esattamente questo.

 0 + true
TypeError: true can't be coerced into Fixnum
from (irb):2:in `+'
from (irb):2

A me pare meno comodo. Amen. :)

Quello che io contesto e' un sistema coerente con aritmetica con i booleani e 
gli interi
*e* 0 != False.

___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


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

2010-02-10 Per discussione Enrico Franchi
On Feb 6, 2010, at 11:46 PM, Pietro Battiston wrote:

 Il punto che forse non è chiaro è cosa sia l'aritmetica.

Sarebbe da capire a chi non è chiaro cosa sia. Sono abbastanza sicuro
di non essere io quello con dubbi o lacune. Qui si sta parlando di aritmetica
mista fra interi e booleani. Che a te da fastidio, a me e a Guido no.

Quello che io ho scritto è semplicemente che *se* vuoi aritmetica che 
coinvolga anche i booleani
di fatto la cosa più naturale è che False sia equivalente a 0 e True ad 1,
al di la del fatto che bool is-a int per l'implementazione corrente.

Se poi bandisci tale aritmetica hai semplicemente un linguaggio
decisamente meno comodo senza essenzialmente nessun vantaggio
concreto.


 Sia dal punto di vista matematico che da quello del Python, == è
 qualcosa che non ha _niente_ a che fare con l'aritmetica: dal punto di
 vista logico-matematico perché l'eguaglianza non è (necessariamente) un
 operatore, dal punto di vista di come ragiona il Python perché == può
 confrontare due oggetti qualsiasi, non solo numerici. Diventa
 l'uguaglianza tra numeri... esattamente quando gli argomenti sono due
 numeri.

1. Da un punto di vista matematico il predicato = (che da pythonisti chiamiamo 
==)
ha *tantissimo* a che fare con l'aritmetica stessa. Non so se hai fatto un 
minimo
di fondamenti, ma fra gli assiomi di peano ci sono precisamente quelli che
riguardano =, senza non fondi l'aritmetica sulla set theory. Puoi fondarla sulla
logica combinatoria, ma ovviamente stiamo spostandoci alquanto.

2. Dal punto di vista matematico un operatore come il == è una bestiaccia. 
Immagino tu non abbia lavorato più di tanto (suppongo nulla) sulla semantica
formale dei linguaggi di programmazione. Formalizzare un linguaggio ad oggetti
è abbastanza un bagno di sangue (fidati, è un bagno di sangue anche avere
un linguaggetto come C). Formalizzare qualcosa come Python è essenzialmente
un suicidio. La semantica denotazionale è essenzialmente inadatta. Io avevo
lavorato parecchio con structured operational semantics, che funzionerebbe
anche decentemente... ma il dinamismo di Python sarebbe una iattura.

 Quindi, tiriamo fuori la matematica dal discorso. O le cose si fanno bene, e
ti garantisco che quando si va sul formale divento *davvero* sgradevolmente
pignolo, oppure la tiriamo indietro. Ma fino in fondo.

Quindi rimaniamo al problema fondamentale: stiamo cercando di avere
booleani che si comportano come gli interi. Se no, devi proibire le commistioni.
Ed essenzialmente hai un altro linguaggio, che non è Python, che è più scomodo
di Python e che, per coerenza, deve andare contro molte convenzioni ed idiomi
pythonici. 

Già... se ci troviamo 

if 0: print ciao - ciao

mi aspetto anche 

if []: print ciao - ciao

e per risolvere la cosa... if bool([])? Fa schifo. Allora tanto vale 
prendersi

if len([]) == 0:


che è un tipico idioma anti-pythonico, sconsigliato a tutti i niubbi.

 Stai scherzando?! Questo punto è stato chiarito 5 mail fa.
 _Evidentemente_ bool(0) == False.

Nope. Tu parti dal presupposto che i bool e gli int debbano essere tipi 
distinti.
E guarda caso concludi che debbano essere tipi distinti.

Il che porta un po' a quello che veramente è stato detto alcune mail fa.
Ovvero che di per se puoi benissimo tirare un'eccezione ogni volta che
mischi interi e booleani. 

Ma *non* è quello che vuole Guido. Per inciso continuo a non vedere 
il vantaggio di farlo in Python. E a quel punto mi aspetto anche che l'inferno
si scateni quando mischio float e interi. 

 Comunque davvero, la cosa più naturale è vedere True e False come numeri a 
 1-bit.
 
 Non dubito che per te possa essere (ormai?) naturale...

Ormai? Non so. Non vedo perchè un numero di un bit non debba essere un numero.
Ah, tu dici che non è un numero. Ok. Un numero di due bit è un numero? No?
Uno di 31? No? uno di 32? Si. Ah, ok.

 Non ci formalizziamo perchè 0 == 0L, ma ci da fastidio False. 
 
 ... ma renditi conto che questo è un argomento che non c'entra niente.

Come non centra niente? 0L è lo 0 dei long, 0 degli int, False dei bool.
Caso che mai non ti fosse sfuggito, long e int sono tipi *diversi* in Python.
Eppure non ti stupisci che lo 0 dei long sia diverso dallo 0 degli interi.
Per non parlare dello 0 dei float e quello degli interi.


 Tutti i tipi numerici hanno somma, sottrazione, moltiplicazione,
 divisione (questa, con qualche distinguo), che definiscono su di essi
 delle immersioni che sono più che canoniche, sono _ovvie_: i naturali
 (chiusi solo per la somma) sono degli interi (chiusi per somma,
 sottrazione, prodotto), che sono dei razionali (OK, questi l'informatica
 per quanto ne so ce li risparmia), che sono dei reali (chiusi per tutte
 le operazioni - tralasciando la rappresentazione approssimata), che
 volendo sono dei complessi.

Ti mancano un sacco di pezzi, mi dispiace. Di fatto ti aspetti erroneamente
che i tipi numerici in macchina si comportino come quelli della matematica.

In primo luogo l'informatica non ci 

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

2010-02-10 Per discussione Marco Mariani
On 02/10/2010 10:48 PM, Enrico Franchi wrote:

 Una volta ammessa sta somma fra interi che da un long,
   

Non ripeterlo troppe volte, perche' P3K ha giustamente unificato gli interi.

-- 
This e-mail (and any attachment(s)) is strictly confidential and for use only 
by intended recipient(s). Any use, distribution, reproduction or disclosure by 
any other person is strictly prohibited. The content of this e-mail does not 
constitute a commitment by the Company except where provided for in a written 
agreement between this e-mail addressee and the Company. If you are not an 
intended recipient(s), please notify the sender promptly and destroy this 
message and its attachments without reading or saving it in any manner. Any non 
authorized use of the content of this message constitutes a violation of the 
obligation to abstain from learning of the correspondence among other subjects, 
except for more serious offence, and exposes the person responsible to the 
relevant consequences.

___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


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

2010-02-10 Per discussione Marco Mariani
On 02/10/2010 10:48 PM, Enrico Franchi wrote:


Altra novita' di Python 3:

 Questo si che fa un po' cacare. Certo un pervertito che va a rinominare True
 si merita tutto il male che può capitargli. E siccome i Pythonisti sono tutti 
 adulti e vaccinati, si fa conto che quella cosa lassù non venga mai fatta e 
 che
 tanto se uno vuole fottere il sistema ci sono anche metodi più creativi.
   

Python 3.1.1 (r311:74480, Feb  1 2010, 17:06:28)
[GCC 4.4.1] on linux2
Type help, copyright, credits or license for more information.
 True=False
  File stdin, line 1
SyntaxError: assignment to keyword


___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


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

2010-02-10 Per discussione Enrico Franchi

On Feb 10, 2010, at 11:19 PM, Marco Mariani wrote:

 Non ripeterlo troppe volte, perche' P3K ha giustamente unificato gli interi.

Giustamente si! Perchè la faccenda era solo un dettaglio implementativo.
E sono molto contento.


___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


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

2010-02-10 Per discussione Pietro Battiston
Il giorno mer, 10/02/2010 alle 22.48 +0100, Enrico Franchi ha scritto:
 On Feb 6, 2010, at 11:46 PM, Pietro Battiston wrote:
 
  Il punto che forse non è chiaro è cosa sia l'aritmetica.
 
 Sarebbe da capire a chi non è chiaro cosa sia. Sono abbastanza sicuro
 di non essere io quello con dubbi o lacune. Qui si sta parlando di aritmetica
 mista fra interi e booleani. Che a te da fastidio, a me e a Guido no.
 
 Quello che io ho scritto è semplicemente che *se* vuoi aritmetica che 
 coinvolga anche i booleani
 di fatto la cosa più naturale è che False sia equivalente a 0 e True ad 1,
 al di la del fatto che bool is-a int per l'implementazione corrente.
 
 Se poi bandisci tale aritmetica hai semplicemente un linguaggio
 decisamente meno comodo senza essenzialmente nessun vantaggio
 concreto.
 

Quando si parla di vantaggi concreti, preferisco farlo davanti a dati
concreti.

 
  Sia dal punto di vista matematico che da quello del Python, == è
  qualcosa che non ha _niente_ a che fare con l'aritmetica: dal punto di
  vista logico-matematico perché l'eguaglianza non è (necessariamente) un
  operatore, dal punto di vista di come ragiona il Python perché == può
  confrontare due oggetti qualsiasi, non solo numerici. Diventa
  l'uguaglianza tra numeri... esattamente quando gli argomenti sono due
  numeri.
 
 1. Da un punto di vista matematico il predicato = (che da pythonisti 
 chiamiamo ==)
 ha *tantissimo* a che fare con l'aritmetica stessa. Non so se hai fatto un 
 minimo
 di fondamenti, ma fra gli assiomi di peano ci sono precisamente quelli che
 riguardano =, senza non fondi l'aritmetica sulla set theory. Puoi fondarla 
 sulla
 logica combinatoria, ma ovviamente stiamo spostandoci alquanto.

Uhm, fammici pensare... sì, ho fatto un minimo di fondamenti.

Ovviamente non intendevo che l'aritmetica possa esistere senza
uguaglianza, ma che il simbolo = può essere definito ben a monte
dell'aritmetica, in maniera vagamente simmetrica a quel che succede
appunto nel Python.

 
 2. Dal punto di vista matematico un operatore come il == è una bestiaccia. 
 Immagino tu non abbia lavorato più di tanto (suppongo nulla) sulla semantica
 formale dei linguaggi di programmazione.

Se le tue intuizioni informatiche sono azzeccate quanto quelle
personali, non mi stupisce la confusione che fai parlandone.

(N.B: non risponderò in maniera polemica a parti della tua email che non
siano gratuitamente polemiche. Anzi, facciamo che alle altre parti
gratuitamente polemiche non rispondo proprio.)

 Formalizzare un linguaggio ad oggetti
 è abbastanza un bagno di sangue (fidati, è un bagno di sangue anche avere
 un linguaggetto come C). Formalizzare qualcosa come Python è essenzialmente
 un suicidio. La semantica denotazionale è essenzialmente inadatta. Io avevo
 lavorato parecchio con structured operational semantics, che funzionerebbe
 anche decentemente... ma il dinamismo di Python sarebbe una iattura.
 
  Quindi, tiriamo fuori la matematica dal discorso. O le cose si fanno bene, e
 ti garantisco che quando si va sul formale divento *davvero* sgradevolmente
 pignolo, oppure la tiriamo indietro. Ma fino in fondo.

La tua teoria secondo cui tutto deve necessariamente essere così com'è
si poteva (almeno, mi ero figurato che si potesse) motivare dal punto di
vista dell'eleganza matematica _o_ dell'attinenza alla mentalità
pythonesca: se tu dici che la matematica non c'entra niente, tirala pure
via, altrimenti vai fino in fondo e facciamo le cose bene, la
precisione non è mai sgradevole.


 Quindi rimaniamo al problema fondamentale: stiamo cercando di avere
 booleani che si comportano come gli interi. Se no, devi proibire le 
 commistioni.
 Ed essenzialmente hai un altro linguaggio, che non è Python, che è più scomodo
 di Python e che, per coerenza, deve andare contro molte convenzioni ed idiomi
 pythonici. 
 
 Già... se ci troviamo 
 
 if 0: print ciao - ciao
 
 mi aspetto anche 
 
 if []: print ciao - ciao
 
 e per risolvere la cosa... if bool([])? Fa schifo. Allora tanto vale 
 prendersi
 
 if len([]) == 0:
 
 
 che è un tipico idioma anti-pythonico, sconsigliato a tutti i niubbi.
 

Stai scherzando?! Questo punto è stato chiarito 6 mail fa.
_Evidentemente_
if 0: print ciao - ...
if []: print ciao - ...

  Stai scherzando?! Questo punto è stato chiarito 5 mail fa.
  _Evidentemente_ bool(0) == False.
 
 Nope. Tu parti dal presupposto che i bool e gli int debbano essere tipi 
 distinti.
 E guarda caso concludi che debbano essere tipi distinti.

Veramente ho concluso che _potrebbero_ benissimo esserlo, e che io lo
troverei più intuitivo - a prescindere dall'abitudine, ovviamente.

 
 Il che porta un po' a quello che veramente è stato detto alcune mail fa.
 Ovvero che di per se puoi benissimo tirare un'eccezione ogni volta che
 mischi interi e booleani. 

Non ne vedo affatto la ragione. Se dopo tutte queste mail ti sfugge
ancora la semantica che ho in mente, te la rispiego: il comportamento
dei bool rimane _ovunque_ quello che è, tranne che 0 

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

2010-02-10 Per discussione Enrico Franchi

On Feb 11, 2010, at 3:12 AM, Alessandro Dentella wrote:

 Era un ottimo proposito... intendo non tediare il gruppo, invece ci hai
 rifilato un polpettone di informazioni la cui faziosità era palese
 dall'inizio (sarebbe offensivo pensare che invece tu non te ne renda conto),

Addirittura faziosità. 

 ben condito con allusioni all'ignoranza degli interlocutori (l'attacco è la
 miglior difesa)

Ovviamente è sfuggito che il primo ad iniziare con tali allusioni è stato un 
altro.

 ed a supposta affinità con bdfl (Guido dice che sarebbe
 meglio una cosa, tu ritieni che è indispensabile l'opposto).

Nessuna affinità. Semplicemente Python, a differenza di tanti altri linguaggi
nasce dal progetto coerente di *una* mente. In tanti contribuiscono e 
propongono,
ma l'ultima parola sta precisamente a Guido.

Il risultato è il python odierno. Può piacere o non piacere. Ma questo è.
Proporlo di cambiarlo andando a toccare dei punti che a Guido piaccioni, è
*evidentemente* improbabile. E *forse* nemmeno tanto sensato.

 A volte mi dico che sei uno psicologo e che usi il gruppo per studiare chi
 reagisce, un po' come Galvani con le rane. Chissà se scrivi di noi nei gruppi
 di psicologia...

No, mi dispiace.
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


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

2010-02-06 Per discussione Marco Mariani
On 02/06/2010 11:03 PM, Enrico Franchi wrote:


 Non ci formalizziamo perchè 0 == 0L, ma ci da fastidio False. 
   

Ma parlate per voi...

A me da' fastidio 'undefined', ritengo che sia la prova ultima che Dio
non esiste :-p

-- 
This e-mail (and any attachment(s)) is strictly confidential and for use only 
by intended recipient(s). Any use, distribution, reproduction or disclosure by 
any other person is strictly prohibited. The content of this e-mail does not 
constitute a commitment by the Company except where provided for in a written 
agreement between this e-mail addressee and the Company. If you are not an 
intended recipient(s), please notify the sender promptly and destroy this 
message and its attachments without reading or saving it in any manner. Any non 
authorized use of the content of this message constitutes a violation of the 
obligation to abstain from learning of the correspondence among other subjects, 
except for more serious offence, and exposes the person responsible to the 
relevant consequences.

___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


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

2010-02-06 Per discussione Pietro Battiston
Il giorno sab, 06/02/2010 alle 23.03 +0100, Enrico Franchi ha scritto:
 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.
 

Il punto che forse non è chiaro è cosa sia l'aritmetica.

Sia dal punto di vista matematico che da quello del Python, == è
qualcosa che non ha _niente_ a che fare con l'aritmetica: dal punto di
vista logico-matematico perché l'eguaglianza non è (necessariamente) un
operatore, dal punto di vista di come ragiona il Python perché == può
confrontare due oggetti qualsiasi, non solo numerici. Diventa
l'uguaglianza tra numeri... esattamente quando gli argomenti sono due
numeri.

 Consideriamo anche ragionevole che:
 
 1) a + (-a) == a - a == 0
 
 2) m - n  0 == m  n


Dove a, m e n sono interi, certo.

 
 
 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. 

Stai scherzando?! Questo punto è stato chiarito 5 mail fa.
_Evidentemente_ bool(0) == False.


 
 Comunque davvero, la cosa più naturale è vedere True e False come numeri a 
 1-bit.

Non dubito che per te possa essere (ormai?) naturale...

 Non ci formalizziamo perchè 0 == 0L, ma ci da fastidio False. 

... ma renditi conto che questo è un argomento che non c'entra niente.

Tutti i tipi numerici hanno somma, sottrazione, moltiplicazione,
divisione (questa, con qualche distinguo), che definiscono su di essi
delle immersioni che sono più che canoniche, sono _ovvie_: i naturali
(chiusi solo per la somma) sono degli interi (chiusi per somma,
sottrazione, prodotto), che sono dei razionali (OK, questi l'informatica
per quanto ne so ce li risparmia), che sono dei reali (chiusi per tutte
le operazioni - tralasciando la rappresentazione approssimata), che
volendo sono dei complessi.

In tutto ciò i booleani, che sono nati come logica a due valori in cui
le due operazioni standard erano or (l'equivalente intero è max, non
una delle operazioni aritmetiche) e and (min), sono un caso a parte.
Ma non c'è solo problema storico: c'è che seppure l'addizione (così come
la sottrazione) assomiglia ad un'operazione logica, lo xor, purtroppo
l'insieme dei booleani _non è chiuso_ rispetto ad essa (dato che anche
assumendo che i booleani siano numeri, True + True non sarebbe un
booleano): ovvero non si comporta affatto come lo xor. Quindi _comunque_
quando parliamo di addizione di booleani è piuttosto ipocrita spacciarla
per un'operazione nativa: è, come tutti hanno ammesso, una comodissima
eredità del C.

D'altronde, vedila in un altro modo: se per te è perfettamente naturale
che i booleani siano semplicemente (un piccolo sottoinsieme degli)
interi, e ti sembra quindi naturale che siano _identici_ in tutto e per
tutto rispettivamente a 0 e 1, non ti sembrerebbe naturale anche che

In [1]: isinstance(1,bool)
Out[1]: True

?!

La scomoda verità è che se volessimo una cosa pulita con False != 0,
il modo giusto sarebbe che, come in C, False e True fossero
semplicemente _definiti_ individualmente come 0 e 1. Solo che il tipo
bool ci fa comodo... mentre la riga di codice che ho scritto sopra è
assolutamente inutile.

Ciò detto, ho già scritto che in fondo me ne frega assai: è evidente
che, posto che Guido si è già espresso, tutto il thread è puramente
teorico.

 
 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.
 

Se vuoi ribattere, fallo con precisione su uno dei punti esposti finora
in una delle tante mail, che sennò non si finisce più.

ciao

Pietro

___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


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

2010-02-05 Per discussione Marco Dalla Stella
Il 04 febbraio 2010 18.38, Enrico Franchi enrico.fran...@gmail.com ha scritto:
 Guarda, è roba di algebra elementare. Se vuoi *veramente* che te la faccia, 
 te la
 faccio pure. Roba da cinque minuti. Per me e per te, basta chiedere.

 Se posso evito di tediare il gruppo con svariate righe di banalità 
 matematiche.

Anch'io son curioso :)
(Per dovere di cronaca, a me piace 0==False).

Ciao,
-- 
Marco Dalla Stella
web: http://thediracsea.org
twitter: http://twitter.com/kra1iz3c
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


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

2010-02-05 Per discussione Enrico Franchi

On Feb 4, 2010, at 7:11 PM, Pietro Battiston wrote:

 Beh, ormai io sono curioso...

Ok. Appena trovo un attimo per ricercare un esempio significativo.
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


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

2010-02-05 Per discussione Raffaele Salmaso
Marco Dalla Stella wrote:
 Ok, si vede che vieni da Java, io personalmente vengo da Perl, per cui... :)
col ca**o, né java né perl
c e c++, prego :D ;)

e li di porcate ne ho anche fatte, altro che int === boolean :D

-- 
()_() | That said, I didn't actually _test_ my patch.  | +
(o.o) | That's what users are for! | +---+
'm m' |   (Linus Torvalds) |  O  |
(___) |  raffaele dot salmaso at gmail dot com |
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


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

2010-02-05 Per discussione Lawrence Oluyede
On Fri, Feb 5, 2010 at 9:41 AM, Raffaele Salmaso
raffaele.salm...@gmail.com wrote:
 e li di porcate ne ho anche fatte, altro che int === boolean :D


Beh in Python non e` che puoi fare molte porcate eh, in genere il
trucchettino di boolean equivalente
ad intero e` usato per la cortocircuitazione logica o la selezione
condizionale. Niente di galattico.

-- 
Lawrence Oluyede
[eng] http://oluyede.org - http://twitter.com/lawrenceoluyede
[ita] http://www.neropercaso.it
[flickr] http://www.flickr.com/photos/rhymes
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


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

2010-02-05 Per discussione Raffaele Salmaso
Marco Dalla Stella wrote:
 Ma perché? A che pro?
chiarezza dell'intento, direi
essere espliciti, e non renderlo implicito o magico o chissàche

-- 
()_() | That said, I didn't actually _test_ my patch.  | +
(o.o) | That's what users are for! | +---+
'm m' |   (Linus Torvalds) |  O  |
(___) |  raffaele dot salmaso at gmail dot com |
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


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

2010-02-05 Per discussione Raffaele Salmaso
Lawrence Oluyede wrote:
 Beh in Python non e` che puoi fare molte porcate eh,
veramente pensavo a giochi con la memoria e altro, che ti viene semplice
in c/c++ e giusto un pelo meno con python

 in genere il
 trucchettino di boolean equivalente
 ad intero e` usato per la cortocircuitazione logica o la selezione
 condizionale. Niente di galattico.
come dissi: comodo, non lo nego
però preferirei essere esplicito nell'intento

-- 
()_() | That said, I didn't actually _test_ my patch.  | +
(o.o) | That's what users are for! | +---+
'm m' |   (Linus Torvalds) |  O  |
(___) |  raffaele dot salmaso at gmail dot com |
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


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

2010-02-05 Per discussione Pietro Battiston
Il giorno ven, 05/02/2010 alle 09.49 +0100, Raffaele Salmaso ha scritto:
 Lawrence Oluyede wrote:
  Beh in Python non e` che puoi fare molte porcate eh,
 veramente pensavo a giochi con la memoria e altro, che ti viene semplice
 in c/c++ e giusto un pelo meno con python
 
  in genere il
  trucchettino di boolean equivalente
  ad intero e` usato per la cortocircuitazione logica o la selezione
  condizionale. Niente di galattico.
 come dissi: comodo, non lo nego
 però preferirei essere esplicito nell'intento
 


Anch'io trovo Haskell un linguaggio molto elegante, a modo suo.

Pietro

___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


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

2010-02-05 Per discussione Marco Dalla Stella
2010/2/5 Raffaele Salmaso raffaele.salm...@gmail.com:
 Marco Dalla Stella wrote:
 Ma perché? A che pro?
 chiarezza dell'intento, direi
 essere espliciti, e non renderlo implicito o magico o chissàche

Il bello del dynamic typing... se no passa ad un linguaggio statically typed...

-- 
Marco Dalla Stella
web: http://thediracsea.org
twitter: http://twitter.com/kra1iz3c
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


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

2010-02-05 Per discussione Raffaele Salmaso
Lawrence Oluyede wrote:
 Vero, ma non ha senso essere espliciti dall'altra parte.
 Fare una cosa come:
 
 (a, b)[c==0]
 
 e` sicuramente una porcata (soprattutto ora che c'e` l'operatore
 ternario), ma non credo che
sinceramente, non mi piace come è implementato l'operatore ternario,
anche se dubito che in python si possa fare di meglio
invece l'idioma di cui sopra non mi dispiace per niente, anche se non è
detto che lo userei paro paro così (di solito gli assegno un nome e poi
lo seleziono)


 if something:
 
 sia piu` oscuro di:
 
 if bool(something):
più che altro, non stavo in effetti pensando solo ad int ma anche a [] e
{} che sono == False

 Avrei piu` paura di cose come 'a' + 3 che altri linguaggi supportano
io no, non li uso e li evito il più possibile ;)

 Comunque non ha molta importanza, separare bool da int ora romperebe
 il 99% del codice esistente :P
direi che se doveva essere fatto, era da fare in python3.0
oramai è solo un chiacchierare che voglia di riscrivere tutto non ne ho
eh :D

-- 
()_() | That said, I didn't actually _test_ my patch.  | +
(o.o) | That's what users are for! | +---+
'm m' |   (Linus Torvalds) |  O  |
(___) |  raffaele dot salmaso at gmail dot com |
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


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

2010-02-05 Per discussione Lawrence Oluyede
2010/2/5 Raffaele Salmaso raffaele.salm...@gmail.com:
 io no, non li uso e li evito il più possibile ;)

Non hai mai usato JavaScript allora :-)

 direi che se doveva essere fatto, era da fare in python3.0

Boh, probabile

 oramai è solo un chiacchierare che voglia di riscrivere tutto non ne ho
 eh :D

:-)

-- 
Lawrence Oluyede
[eng] http://oluyede.org - http://twitter.com/lawrenceoluyede
[ita] http://www.neropercaso.it
[flickr] http://www.flickr.com/photos/rhymes
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


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

2010-02-05 Per discussione Raffaele Salmaso
Lawrence Oluyede wrote:
 2010/2/5 Raffaele Salmaso raffaele.salm...@gmail.com:
 io no, non li uso e li evito il più possibile ;)
 
 Non hai mai usato JavaScript allora :-)
ho detto possibile, non che non ci riesco
(poi invero non è molto malvagio, a parte circa il 70% - conservativo -
di regole da riscrivere... per fortuna cerco di usare solo chiamate a
jquery e basta :D)

-- 
()_() | That said, I didn't actually _test_ my patch.  | +
(o.o) | That's what users are for! | +---+
'm m' |   (Linus Torvalds) |  O  |
(___) |  raffaele dot salmaso at gmail dot com |
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


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

2010-02-05 Per discussione Wyrmskull

  (Per dovere di cronaca, a me piace 0==False).
  A me sinceramente no.
  Un booleano è un booleano.
  Un numero è un numero.
 chiarezza dell'intento, direi
 essere espliciti, e non renderlo implicito o magico o chissàche

 if not(return_code):
 if (return_code == 0):
 if not(bool(return_code)):

La condizione è una comparazione fra due variabili di tipo diverso,
ma l'intero rimane intero e il booleano rimane booleano.

 return_code = 0
 if not(return_code):
... print type(return_code)
...
type 'int'

Questo permette di essere molto semplici nel costruire le condizioni

1)
a = list('abcdefghilmnopqrstuvz')
while a:
print a.pop()

2) while len(a)0:
3) while bool(len(a)):

Lo leggo così: Finchè la lista  'a' è ancora significativa:

---
Wyrmskull
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


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

2010-02-05 Per discussione Pietro Battiston
Il giorno ven, 05/02/2010 alle 10.07 +0100, Lawrence Oluyede ha scritto:
 2010/2/5 Pietro Battiston too...@email.it:
  In [5]: [] == False
  Out[5]: False
 
 In [2]: if []: print aa
...:
 

ovviamente l'osservazione che vorrei scrivere è quella che nel
frattempo ha scritto Sandro...

Pietro

___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


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

2010-02-05 Per discussione Raffaele Salmaso
Lawrence Oluyede wrote:
 A me JS piace :-)
prova lua[1] allora: js done right ;)
peccato non vada in un browser...
poi anche a me non dispiace, solo che ha regole in alcuni casi un po'
diciamo sui generis, indi cerco di usarlo il meno spinto possibile.

[1] http://www.lua.org

-- 
()_() | That said, I didn't actually _test_ my patch.  | +
(o.o) | That's what users are for! | +---+
'm m' |   (Linus Torvalds) |  O  |
(___) |  raffaele dot salmaso at gmail dot com |
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


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

2010-02-05 Per discussione Daniele Varrazzo
On Fri, 5 Feb 2010 09:57:44 +0100, Lawrence Oluyede l.oluy...@gmail.com
wrote:
 2010/2/5 Pietro Battiston too...@email.it:
 A questo punto, la
 domanda è, a parità di duck typing, cosa abbia di comodo 0 == False, e
 l'unica risposta che sono in grado di formulare è facilità di
 implementazione.
 
 Non e` quella l'unica risposta, e` molto comodo avere 0, [], {}, () e
 altri contenitori equivalenti a False.
 Si parla di programmazione all'atto pratico, non per forza di
 comodita` dell'implementatore.

Rispondo a questo msg ma solo perché non saprei a quale appendermi :P

Non confondiamo 2 cose: una è essere falso in contesto booleano, per cui
if X: può andare in un ramo o nell'altro a seconda del valore di
X.__nonzero__(). Un'altra è il fatto che si possa fare True + False
(l'algebra di boole non prevede operatori numerici tipo la somma). Un'altra
ancora è il fatto che True + True faccia 2 (che volendo è un dettaglio
implementativo, volendo è una convenzione che viene dal C). Bene: le due
cose da non confondere sono 3.

1) Il fatto che ci siano diverse cose testabili come valori di verità è
molto comodo in python, più ancora di avere True e False (che infatti sono
abbastanza recenti: python 2.3 iirc). Chiedere che if []: non debba essere
possibile ma debba essere necessario fare if bool([]): mi sembra fuori
questione (non così per Raffaele Salmaso, quindi non è un gusto
universale... a me piace che sia così).

2) Se Python fosse puristicamente puro, forse bool non implementerebbe la
somma. Ora la implementa semplicemente perché eredita da int, ma se anche
non fosse così l'aritmetica mista (1 + true) sarebbe comunque auspicata
(anche nel mondo perfetto evocato da Guido) per cui, o implementando
__add__, o implementando __int__ e quindi lasciandosi sommare dopo una
conversione in un intero, in qualche modo si sarebbe fatto. È come dire è
sensato che esista una funzione definita dai bool agli int. Se non
esistesse, la gente se la scriverebbe perché farebbe comodo, quindi tanto
vale uniformare il valore di di int(B) per ogni B booleano.

3) Deciso che deve fare un numero, quanto devono valere int(True) e
int(False)? Python usa la convenzione C, dove non ci sono bool, solo
numeri, e 0 è il valore falso (quello che fa prendere il ramo else ad un
if) e 1 è il valore vero (nel senso che !0 = 1, e !!10 = 1, non che esista
una keyword true). È un numero sensato perché non é dipendente
dall'implementazione (mentre il risultato del not booleano ~0 lo è) e
perché qualunque rappresentazione numerica plausibile (interi, floating
point, virgola fissa, numeri complessi...) penso si possa assumere conterrà
0 e 1 :)

Credo che il thread sia partito facendosi domande sul punto 2). False == 0
deriva dal fatto che per Python si sia scelto di avere aritmetica mista (il
fatto che bool subclassi int è un dettaglio di come si sia ottenuta). È una
scelta che si sarebbe potuto non fare, sono abbastanza sicuro che linguaggi
BDSM tipo Pascal non l'adottino, ma rientra abbastanza nello stile
Python: è utile e, una volta deciso quanto fa int(B), non è ambigua (come
invece lo è int + str: in tanti linguaggi 10 + 20 ha un risultato e se
sia 30 o 1020 sta al gusto del suo progettista).

-- 
Daniele Varrazzo - Develer S.r.l. 
http://www.develer.com
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


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

2010-02-05 Per discussione Pietro Battiston
Il giorno ven, 05/02/2010 alle 13.25 +0100, Daniele Varrazzo ha scritto:
 On Fri, 5 Feb 2010 09:57:44 +0100, Lawrence Oluyede l.oluy...@gmail.com
 wrote:
  2010/2/5 Pietro Battiston too...@email.it:
  A questo punto, la
  domanda è, a parità di duck typing, cosa abbia di comodo 0 == False, e
  l'unica risposta che sono in grado di formulare è facilità di
  implementazione.
  
  Non e` quella l'unica risposta, e` molto comodo avere 0, [], {}, () e
  altri contenitori equivalenti a False.
  Si parla di programmazione all'atto pratico, non per forza di
  comodita` dell'implementatore.
 
 Rispondo a questo msg ma solo perché non saprei a quale appendermi :P
 
 Non confondiamo 2 cose: una è essere falso in contesto booleano, per cui
 if X: può andare in un ramo o nell'altro a seconda del valore di
 X.__nonzero__(). Un'altra è il fatto che si possa fare True + False
 (l'algebra di boole non prevede operatori numerici tipo la somma).

A me veniva spontaneo identificare il lavoro su campi finiti, e in
particolare sugli interi modulo 2^n, ed in particolare sugli interi
modulo 2, con un'estensione dell'algebra di boole: per questo immaginavo
con + lo xor. Ma riconosco che può essere un viaggio mentale mio, e
comunque non c'entra molto col nocciolo del discorso.

 Un'altra
 ancora è il fatto che True + True faccia 2 (che volendo è un dettaglio
 implementativo, volendo è una convenzione che viene dal C). Bene: le due
 cose da non confondere sono 3.
 
 1) Il fatto che ci siano diverse cose testabili come valori di verità è
 molto comodo in python, più ancora di avere True e False (che infatti sono
 abbastanza recenti: python 2.3 iirc). Chiedere che if []: non debba essere
 possibile ma debba essere necessario fare if bool([]): mi sembra fuori
 questione (non così per Raffaele Salmaso, quindi non è un gusto
 universale... a me piace che sia così).

e qui ci siamo

 
 2) Se Python fosse puristicamente puro, forse bool non implementerebbe la
 somma. Ora la implementa semplicemente perché eredita da int, ma se anche
 non fosse così l'aritmetica mista (1 + true) sarebbe comunque auspicata
 (anche nel mondo perfetto evocato da Guido) per cui, o implementando
 __add__, o implementando __int__ e quindi lasciandosi sommare dopo una
 conversione in un intero, in qualche modo si sarebbe fatto. È come dire è
 sensato che esista una funzione definita dai bool agli int. Se non
 esistesse, la gente se la scriverebbe perché farebbe comodo, quindi tanto
 vale uniformare il valore di di int(B) per ogni B booleano.

ci siamo

 
 3) Deciso che deve fare un numero,

nel senso - e solo nel senso - che deve _comportarsi come un numero_ dal
punto di vista del duck typing

 quanto devono valere int(True) e
 int(False)? Python usa la convenzione C, dove non ci sono bool, solo
 numeri, e 0 è il valore falso (quello che fa prendere il ramo else ad un
 if) e 1 è il valore vero (nel senso che !0 = 1, e !!10 = 1, non che esista
 una keyword true). È un numero sensato perché non é dipendente
 dall'implementazione (mentre il risultato del not booleano ~0 lo è) e
 perché qualunque rappresentazione numerica plausibile (interi, floating
 point, virgola fissa, numeri complessi...) penso si possa assumere conterrà
 0 e 1 :)

ci siamo

 
 Credo che il thread sia partito facendosi domande sul punto 2).

Credo di no: nel punto 2) ti chiedi se la somma e il casting automatico
a int dei booleani abbia senso, e io come te credo di sì.

Il punto è solo se Bool deve essere una subclass di int.

E ribadisco che a me sembra solo una facilità di implementazione.

 False == 0
 deriva dal fatto che per Python si sia scelto di avere aritmetica mista (il
 fatto che bool subclassi int è un dettaglio di come si sia ottenuta). È una
 scelta che si sarebbe potuto non fare, sono abbastanza sicuro che linguaggi
 BDSM tipo Pascal non l'adottino, ma rientra abbastanza nello stile
 Python: è utile e, una volta deciso quanto fa int(B), non è ambigua (come
 invece lo è int + str: in tanti linguaggi 10 + 20 ha un risultato e se
 sia 30 o 1020 sta al gusto del suo progettista).
 


Ripeto: in un mondo ideale, io asserterei True + 1 == 2 _e_ True !=
1 senza timore...

Vedila così: supponi che in Python i booleano non siano interi, e
supponi che esca uno e dica __add__ tra bool e numerici non è
implementato: implementiamolo come __add__ tra numerici dopo avere
trasformato False in 0 e True in 1, può fare comodo. Allora a mio
avviso avremmo il mondo ideale.

Pietro

___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


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

2010-02-05 Per discussione Daniele Varrazzo
On Fri, 05 Feb 2010 14:41:00 +0100, Pietro Battiston too...@email.it
wrote:
 Il giorno ven, 05/02/2010 alle 13.25 +0100, Daniele Varrazzo ha scritto:
 On Fri, 5 Feb 2010 09:57:44 +0100, Lawrence Oluyede
l.oluy...@gmail.com
 wrote:
  2010/2/5 Pietro Battiston too...@email.it:
  A questo punto, la
  domanda è, a parità di duck typing, cosa abbia di comodo 0 == False,
  e
  l'unica risposta che sono in grado di formulare è facilità di
  implementazione.
  
  Non e` quella l'unica risposta, e` molto comodo avere 0, [], {}, () e
  altri contenitori equivalenti a False.
  Si parla di programmazione all'atto pratico, non per forza di
  comodita` dell'implementatore.
 
 Rispondo a questo msg ma solo perché non saprei a quale appendermi :P
 
 Non confondiamo 2 cose: una è essere falso in contesto booleano, per
 cui
 if X: può andare in un ramo o nell'altro a seconda del valore di
 X.__nonzero__(). Un'altra è il fatto che si possa fare True + False
 (l'algebra di boole non prevede operatori numerici tipo la somma).
 
 A me veniva spontaneo identificare il lavoro su campi finiti, e in
 particolare sugli interi modulo 2^n, ed in particolare sugli interi
 modulo 2, con un'estensione dell'algebra di boole: per questo immaginavo
 con + lo xor. Ma riconosco che può essere un viaggio mentale mio, e
 comunque non c'entra molto col nocciolo del discorso.
 
 Un'altra
 ancora è il fatto che True + True faccia 2 (che volendo è un dettaglio
 implementativo, volendo è una convenzione che viene dal C). Bene: le
due
 cose da non confondere sono 3.
 
 1) Il fatto che ci siano diverse cose testabili come valori di verità
 è
 molto comodo in python, più ancora di avere True e False (che infatti
 sono
 abbastanza recenti: python 2.3 iirc). Chiedere che if []: non debba
 essere
 possibile ma debba essere necessario fare if bool([]): mi sembra
fuori
 questione (non così per Raffaele Salmaso, quindi non è un gusto
 universale... a me piace che sia così).
 
 e qui ci siamo
 
 
 2) Se Python fosse puristicamente puro, forse bool non implementerebbe
la
 somma. Ora la implementa semplicemente perché eredita da int, ma se
 anche
 non fosse così l'aritmetica mista (1 + true) sarebbe comunque auspicata
 (anche nel mondo perfetto evocato da Guido) per cui, o implementando
 __add__, o implementando __int__ e quindi lasciandosi sommare dopo una
 conversione in un intero, in qualche modo si sarebbe fatto. È come dire
 è
 sensato che esista una funzione definita dai bool agli int. Se non
 esistesse, la gente se la scriverebbe perché farebbe comodo, quindi
 tanto
 vale uniformare il valore di di int(B) per ogni B booleano.
 
 ci siamo
 
 
 3) Deciso che deve fare un numero,
 
 nel senso - e solo nel senso - che deve _comportarsi come un numero_ dal
 punto di vista del duck typing
 
 quanto devono valere int(True) e
 int(False)? Python usa la convenzione C, dove non ci sono bool, solo
 numeri, e 0 è il valore falso (quello che fa prendere il ramo else ad
un
 if) e 1 è il valore vero (nel senso che !0 = 1, e !!10 = 1, non che
 esista
 una keyword true). È un numero sensato perché non é dipendente
 dall'implementazione (mentre il risultato del not booleano ~0 lo è) e
 perché qualunque rappresentazione numerica plausibile (interi, floating
 point, virgola fissa, numeri complessi...) penso si possa assumere
 conterrà
 0 e 1 :)
 
 ci siamo
 
 
 Credo che il thread sia partito facendosi domande sul punto 2).
 
 Credo di no: nel punto 2) ti chiedi se la somma e il casting automatico
 a int dei booleani abbia senso, e io come te credo di sì.
 
 Il punto è solo se Bool deve essere una subclass di int.

La domanda originale, come riportata anche nel titolo è: perchè 0 in
(False,) fa True? Questa è una diretta conseguenza di tuple.__contains__,
che porta alla domanda perché '0 == False' fa True?. Questo è perché si è
desiderata l'aritmetica mista. Alessandro fa un passo ulteriore e incolpa
questa proprietà al fatto che bool sublassi int. Ma il subclassing è solo
il modo (economico) in cui si è deciso di implementare la proprietà: si
sarebbe potuto avere aritmetica mista senza subclass, ed entrambe le
domande nel titolo del post sarebbero ancora... domandabili.


 Ripeto: in un mondo ideale, io asserterei True + 1 == 2 _e_ True !=
 1 senza timore...

A me un pò di timore fa... Se le due proprietà di sopra fossero vere:

True + 1 == 2 = True + 1 - 1 == 2 - 1 = True == 1

Quindi non puoi avere anche True != 1, a meno di non rompere il
funzionamento degli interi.

-- 
Daniele Varrazzo - Develer S.r.l. 
http://www.develer.com
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


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

2010-02-05 Per discussione Pietro Battiston
Il giorno ven, 05/02/2010 alle 14.58 +0100, Daniele Varrazzo ha scritto:
 On Fri, 05 Feb 2010 14:41:00 +0100, Pietro Battiston too...@email.it
 wrote:
  Il giorno ven, 05/02/2010 alle 13.25 +0100, Daniele Varrazzo ha scritto:
  On Fri, 5 Feb 2010 09:57:44 +0100, Lawrence Oluyede
 l.oluy...@gmail.com
  wrote:
   2010/2/5 Pietro Battiston too...@email.it:
   A questo punto, la
   domanda è, a parità di duck typing, cosa abbia di comodo 0 == False,
   e
   l'unica risposta che sono in grado di formulare è facilità di
   implementazione.
   
   Non e` quella l'unica risposta, e` molto comodo avere 0, [], {}, () e
   altri contenitori equivalenti a False.
   Si parla di programmazione all'atto pratico, non per forza di
   comodita` dell'implementatore.
  
  Rispondo a questo msg ma solo perché non saprei a quale appendermi :P
  
  Non confondiamo 2 cose: una è essere falso in contesto booleano, per
  cui
  if X: può andare in un ramo o nell'altro a seconda del valore di
  X.__nonzero__(). Un'altra è il fatto che si possa fare True + False
  (l'algebra di boole non prevede operatori numerici tipo la somma).
  
  A me veniva spontaneo identificare il lavoro su campi finiti, e in
  particolare sugli interi modulo 2^n, ed in particolare sugli interi
  modulo 2, con un'estensione dell'algebra di boole: per questo immaginavo
  con + lo xor. Ma riconosco che può essere un viaggio mentale mio, e
  comunque non c'entra molto col nocciolo del discorso.
  
  Un'altra
  ancora è il fatto che True + True faccia 2 (che volendo è un dettaglio
  implementativo, volendo è una convenzione che viene dal C). Bene: le
 due
  cose da non confondere sono 3.
  
  1) Il fatto che ci siano diverse cose testabili come valori di verità
  è
  molto comodo in python, più ancora di avere True e False (che infatti
  sono
  abbastanza recenti: python 2.3 iirc). Chiedere che if []: non debba
  essere
  possibile ma debba essere necessario fare if bool([]): mi sembra
 fuori
  questione (non così per Raffaele Salmaso, quindi non è un gusto
  universale... a me piace che sia così).
  
  e qui ci siamo
  
  
  2) Se Python fosse puristicamente puro, forse bool non implementerebbe
 la
  somma. Ora la implementa semplicemente perché eredita da int, ma se
  anche
  non fosse così l'aritmetica mista (1 + true) sarebbe comunque auspicata
  (anche nel mondo perfetto evocato da Guido) per cui, o implementando
  __add__, o implementando __int__ e quindi lasciandosi sommare dopo una
  conversione in un intero, in qualche modo si sarebbe fatto. È come dire
  è
  sensato che esista una funzione definita dai bool agli int. Se non
  esistesse, la gente se la scriverebbe perché farebbe comodo, quindi
  tanto
  vale uniformare il valore di di int(B) per ogni B booleano.
  
  ci siamo
  
  
  3) Deciso che deve fare un numero,
  
  nel senso - e solo nel senso - che deve _comportarsi come un numero_ dal
  punto di vista del duck typing
  
  quanto devono valere int(True) e
  int(False)? Python usa la convenzione C, dove non ci sono bool, solo
  numeri, e 0 è il valore falso (quello che fa prendere il ramo else ad
 un
  if) e 1 è il valore vero (nel senso che !0 = 1, e !!10 = 1, non che
  esista
  una keyword true). È un numero sensato perché non é dipendente
  dall'implementazione (mentre il risultato del not booleano ~0 lo è) e
  perché qualunque rappresentazione numerica plausibile (interi, floating
  point, virgola fissa, numeri complessi...) penso si possa assumere
  conterrà
  0 e 1 :)
  
  ci siamo
  
  
  Credo che il thread sia partito facendosi domande sul punto 2).
  
  Credo di no: nel punto 2) ti chiedi se la somma e il casting automatico
  a int dei booleani abbia senso, e io come te credo di sì.
  
  Il punto è solo se Bool deve essere una subclass di int.
 
 La domanda originale, come riportata anche nel titolo è: perchè 0 in
 (False,) fa True? Questa è una diretta conseguenza di tuple.__contains__,
 che porta alla domanda perché '0 == False' fa True?. Questo è perché si è
 desiderata l'aritmetica mista. 

no, vedi sotto

 Alessandro fa un passo ulteriore e incolpa
 questa proprietà al fatto che bool sublassi int. Ma il subclassing è solo
 il modo (economico) in cui si è deciso di implementare la proprietà: si
 sarebbe potuto avere aritmetica mista senza subclass, ed entrambe le
 domande nel titolo del post sarebbero ancora... domandabili.
 
 
  Ripeto: in un mondo ideale, io asserterei True + 1 == 2 _e_ True !=
  1 senza timore...
 
 A me un pò di timore fa... Se le due proprietà di sopra fossero vere:
 
 True + 1 == 2 = True + 1 - 1 == 2 - 1 = True == 1
 
 Quindi non puoi avere anche True != 1, a meno di non rompere il
 funzionamento degli interi.
 

A me sembra tu stia assumendo che True sia un intero (dato che parli di
funzionamento degli interi) per concludere che deve essere un intero.
Io ti dico che non lo vorrei nemmeno considerato come tipo numerico, ma
come un generico tipo che fa il casting ad intero(/float) in modo
sensato nelle 

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

2010-02-05 Per discussione Daniele Varrazzo
On Fri, 05 Feb 2010 17:39:46 +0100, Pietro Battiston too...@email.it
wrote:

 Per carità, dal punto di vista storico è chiaro, e non sto neanche
 facendo una battaglia perché si cambi: vorrei solo che si riconoscesse
 che non c'è nessun motivo assoluto per cui debba essere così.

Ok, non c'era nessun motivo assoluto per cui dovesse essere così. Su
questo hai ragione.

Si sarebbe potuto fare:

bool == int è sempre falso
bool != int è sempre vero
bool , , =, = int spara un'eccezione
int(True) = 1
int(False) = 0
bool op int = int(bool) op int per ogni op aritmetica.

Se invece i tipi funzionano con la semantica attuale è solo per
convenzione e utilità. Se questa semantica è implementa come subclass è
solo per comodità di implementazione.

-- 
Daniele Varrazzo - Develer S.r.l. 
http://www.develer.com
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


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

2010-02-05 Per discussione Pietro Battiston
Il giorno ven, 05/02/2010 alle 17.53 +0100, Daniele Varrazzo ha scritto:
 On Fri, 05 Feb 2010 17:39:46 +0100, Pietro Battiston too...@email.it
 wrote:
 
  Per carità, dal punto di vista storico è chiaro, e non sto neanche
  facendo una battaglia perché si cambi: vorrei solo che si riconoscesse
  che non c'è nessun motivo assoluto per cui debba essere così.
 
 Ok, non c'era nessun motivo assoluto per cui dovesse essere così. Su
 questo hai ragione.
 
 Si sarebbe potuto fare:
 
 bool == int è sempre falso
 bool != int è sempre vero
 bool , , =, = int spara un'eccezione

Solo in Python 3 :-)

Pietro

 int(True) = 1
 int(False) = 0
 bool op int = int(bool) op int per ogni op aritmetica.
 
 Se invece i tipi funzionano con la semantica attuale è solo per
 convenzione e utilità. Se questa semantica è implementa come subclass è
 solo per comodità di implementazione.
 



___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


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

2010-02-05 Per discussione Alessandro Dentella
On Fri, Feb 05, 2010 at 05:53:01PM +0100, Daniele Varrazzo wrote:
 On Fri, 05 Feb 2010 17:39:46 +0100, Pietro Battiston too...@email.it
 wrote:
 
  Per carità, dal punto di vista storico è chiaro, e non sto neanche
  facendo una battaglia perché si cambi: vorrei solo che si riconoscesse
  che non c'è nessun motivo assoluto per cui debba essere così.
 
 Ok, non c'era nessun motivo assoluto per cui dovesse essere così. Su
 questo hai ragione.
 
 Si sarebbe potuto fare:
 
 bool == int è sempre falso
 bool != int è sempre vero
 bool , , =, = int spara un'eccezione
 int(True) = 1
 int(False) = 0
 bool op int = int(bool) op int per ogni op aritmetica.
 
 Se invece i tipi funzionano con la semantica attuale è solo per
 convenzione e utilità. Se questa semantica è implementa come subclass è
 solo per comodità di implementazione.


Grazie per i chiarimenti e l'interessante discussione in particolare
a Pietro e Daniele per l'analisi e gli esempi di supporto.

Personalemnte mi pare chiaro che la prima citazione di Guido è perfettamente
in linea con quanto scritto qui sopra... in attesa che Enrico mantenga la
promessa e mostri gli assurdi completi che quanto scritto sopra
comporterebbe. 

sandro
*:-)

___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


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

2010-02-04 Per discussione Marco Mariani
On 02/04/2010 10:26 AM, Alessandro Dentella wrote:
 Ciao,

 (solo) oggi mi sono imbattuto in 0 in (False,) che ha un comportamento
 francamente controintuitivo:

   In [1]: 0 in (False,)
   Out[1]: True

 che a sua volta dipende dal fatto che:

   In [2]: 0 == False
   Out[2]: True
   

Si', e' sempre stato cosi'. Anche prima che esistesse il tipo boolean,
True e False erano interi.


 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.

Mi piace meno come si comporta javascript, dove 0 == false ma 0 !==
false, quindi i tipi sono distinti, come preferisci tu.
Ma tutti gli oggetti sono true, anche l'oggetto false (*):


  0
 0
  Boolean(0)
 false
  Boolean(Boolean(0))
 false
  new Boolean(0)
 false {}
  Boolean(new Boolean(0))
 true
  new Boolean(new Boolean(0))
 true {}





(*) ovvero, l'oggetto che wrappa false. argh

-- 
This e-mail (and any attachment(s)) is strictly confidential and for use only 
by intended recipient(s). Any use, distribution, reproduction or disclosure by 
any other person is strictly prohibited. The content of this e-mail does not 
constitute a commitment by the Company except where provided for in a written 
agreement between this e-mail addressee and the Company. If you are not an 
intended recipient(s), please notify the sender promptly and destroy this 
message and its attachments without reading or saving it in any manner. Any non 
authorized use of the content of this message constitutes a violation of the 
obligation to abstain from learning of the correspondence among other subjects, 
except for more serious offence, and exposes the person responsible to the 
relevant consequences.

___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


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

2010-02-04 Per discussione Enrico Franchi

On Feb 4, 2010, at 10:26 AM, Alessandro Dentella 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?

Non e' questione di ereditare in questo caso.
Non mi da fastidio che un booleano sia il piu' piccolo tipo numerico che porta
informazione. 

Un char e' un tipo numerico di (tipicamente) 8 bit. Perche' un booleano non puo'
essere un tipo numerico di 1 bit?
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


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

2010-02-04 Per discussione Alessandro Dentella
On Thu, Feb 04, 2010 at 11:04:59AM +0100, Enrico Franchi wrote:
 
 On Feb 4, 2010, at 10:26 AM, Alessandro Dentella 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?
 
 Non e' questione di ereditare in questo caso.

  ??? 
   issubclass(bool, int)
  True

Non sto testando che bool deriva da int? in che senso non è questione di 
ereditare

 Non mi da fastidio che un booleano sia il piu' piccolo tipo numerico che porta
 informazione. 

Questa però non mi pare la risposta a che bisogno c'è. Che non è una
domana oziosa, è che immagino che ci *sia* bisogno in un modo che io ora non
colgo. La domanda rifrasata sarebbe forse: quali sono le caratteristiche di
un booleano che derivano da un intero?

Riprendendo la tua risposta: che bisogno c'è che sia il più piccolo tipo
*numerico* che porta informazione?

sandro



-- 
Sandro Dentella  *:-)
http://sqlkit.argolinux.orgSQLkit home page - PyGTK/python/sqlalchemy
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


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

2010-02-04 Per discussione Daniele Varrazzo
On Thu, 4 Feb 2010 10:26:40 +0100, Alessandro Dentella san...@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
modo rapido per sapere quanti True hai in un insieme è sommare i valori
logici tra loro. O fare giochini tipo:

In [1]: def leggi_lati_triangolo():
   ...: return map(int, raw_input().split())
   ...: 

In [2]: a, b, c = leggi_lati_triangolo()
3 4 4

In [3]: {0: 'scaleno', 1: 'isoscele', 3: 'equilatero'}[(a == b) + (b == c)
+ (a == c)]
Out[3]: 'isoscele'

In calcolo numerico si usa spesso moltiplicare una matrice numerica per
una matrice di booleani: la semplice moltiplicazione restituisce una
matrice che contiene solo i valori numerici corrispondenti ai vero dei
booleani. Perché dovrebbe essere più facile fare queste operazioni in C che
in Python? ;)

-- 
Daniele Varrazzo - Develer S.r.l. 
http://www.develer.com
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


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

2010-02-04 Per discussione Alessandro Dentella
On Thu, Feb 04, 2010 at 01:15:37PM +0100, Daniele Varrazzo wrote:
 On Thu, 4 Feb 2010 10:26:40 +0100, Alessandro Dentella san...@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
 modo rapido per sapere quanti True hai in un insieme è sommare i valori
 logici tra loro. O fare giochini tipo:
 
 In [1]: def leggi_lati_triangolo():
...: return map(int, raw_input().split())
...: 
 
 In [2]: a, b, c = leggi_lati_triangolo()
 3 4 4
 
 In [3]: {0: 'scaleno', 1: 'isoscele', 3: 'equilatero'}[(a == b) + (b == c)
 + (a == c)]
 Out[3]: 'isoscele'
 
 In calcolo numerico si usa spesso moltiplicare una matrice numerica per
 una matrice di booleani: la semplice moltiplicazione restituisce una
 matrice che contiene solo i valori numerici corrispondenti ai vero dei
 booleani. Perché dovrebbe essere più facile fare queste operazioni in C che
 in Python? ;)
 
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

sandro
*:-)


-- 
Sandro Dentella  *:-)
http://sqlkit.argolinux.orgSQLkit home page - PyGTK/python/sqlalchemy
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


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

2010-02-04 Per discussione Daniele Varrazzo
On Thu, 4 Feb 2010 13:36:25 +0100, Alessandro Dentella san...@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
san...@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
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


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

2010-02-04 Per discussione Enrico Franchi

On Feb 4, 2010, at 5:22 PM, Alessandro Dentella wrote:

 Asserzione gratuita con promessa di dimostrazione. Dimostrazione che non
 dubito esista, è infatti quella che andavo cercando...

Guarda, è roba di algebra elementare. Se vuoi *veramente* che te la faccia, te 
la
faccio pure. Roba da cinque minuti. Per me e per te, basta chiedere. 

Se posso evito di tediare il gruppo con svariate righe di banalità matematiche. 

___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python