Re: [Python] Glitch

2013-01-07 Per discussione Giovanni Porcari

Il giorno 04/gen/2013, alle ore 15:02, Davide Alberani d...@mimante.net ha 
scritto:

 2013/1/4 Marco Beri marcob...@gmail.com:
 
 Chi indovina cosa stampa l'ultima riga di questo snippet senza eseguirlo? Si
 accettano tentativi :-)
 
 Non è un glitch.  Prima estende la lista,
 poi fa un assegnamento ad un elemento
 di una tupla.  Garantito che te lo prendi
 nei denti... ma intanto l'estensione alla
 lista (tipo mutabile) l'ha fatta. :-)


Non è ACID e dovrebbe fare un bel rollback... :D


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


Re: [Python] Glitch

2013-01-07 Per discussione Nicola Larosa
Giovanni Porcari wrote:
 Non è ACID e dovrebbe fare un bel rollback... :D

E per fortuna non è neanche BASIC. ;-)

-- 
Nicola Larosa - http://www.tekNico.net/

Now it’s time for phase II, where we use a hundred or so copies of the
Macx-1 to build the Cosmic Background Bufferbloat Detector and fix the
Internet. - Eric Raymond, http://esr.ibiblio.org/?p=4335, May 2012

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


Re: [Python] Glitch

2013-01-05 Per discussione Davide Alberani
2013/1/4 Marco Beri marcob...@gmail.com:

 Chi indovina cosa stampa l'ultima riga di questo snippet senza eseguirlo? Si
 accettano tentativi :-)

Non è un glitch.  Prima estende la lista,
poi fa un assegnamento ad un elemento
di una tupla.  Garantito che te lo prendi
nei denti... ma intanto l'estensione alla
lista (tipo mutabile) l'ha fatta. :-)

Da cui, se ne evince che il metodo extend
delle liste in fondo in fondo non sta lì per
bellezza. ;-)

Poi ovvio che è un comportamento un poco
inaspettato... io ci ho sbattuto contro qualche
anno fa, e fu divertente.  Sì, divertente, diciamo.


--
Davide Alberani d...@mimante.net  [PGP KeyID: 0x465BFD47]
http://www.mimante.net/
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Glitch

2013-01-05 Per discussione Simone Federici
a naso avrei detto che questo avrebbe dato lo stesso problema

 T = ([],)
 T[0].__iadd__([3])
[3]

 T = ([],)
 T[0] += [3]
Traceback (most recent call last):
  File ipython-input-62-a940dfebc38f, line 1, in module
T[0] += [3]
TypeError: 'tuple' object does not support item assignment


http://docs.python.org/2/reference/datamodel.html?highlight=iadd#object.__iadd__


 T = ([],)
 T[0] = T[0].__iadd__([3])
Traceback (most recent call last):
  File ipython-input-65-d9efb2b8bc4b, line 1, in module
T[0] = T[0].__iadd__([3])
TypeError: 'tuple' object does not support item assignment

 T
([3],)

ma dalla ducumentazione si capisce che
object.__iadd__ dovrebbe/*potrebbe* ritornare self o un altro oggetto

il che lascia fuori l'assegnamento,
potremmo dire che l'assegmanento è decisamente inutile se l'oggetto ha una
implementazione dell'__iadd__ che ritorna self, ma anche no.

in conclusione è veramente brutto e allo stesso tempo meraviglioso

2013/1/4 Davide Alberani d...@mimante.net

 2013/1/4 Marco Beri marcob...@gmail.com:
 
  Chi indovina cosa stampa l'ultima riga di questo snippet senza
 eseguirlo? Si
  accettano tentativi :-)

 Non è un glitch.  Prima estende la lista,
 poi fa un assegnamento ad un elemento
 di una tupla.  Garantito che te lo prendi
 nei denti... ma intanto l'estensione alla
 lista (tipo mutabile) l'ha fatta. :-)

 Da cui, se ne evince che il metodo extend
 delle liste in fondo in fondo non sta lì per
 bellezza. ;-)

 Poi ovvio che è un comportamento un poco
 inaspettato... io ci ho sbattuto contro qualche
 anno fa, e fu divertente.  Sì, divertente, diciamo.


 --
 Davide Alberani d...@mimante.net  [PGP KeyID: 0x465BFD47]
 http://www.mimante.net/
 ___
 Python mailing list
 Python@lists.python.it
 http://lists.python.it/mailman/listinfo/python

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


Re: [Python] Glitch

2013-01-04 Per discussione Lorenzo Macchiavelli
Non ho resistito!! :)

Lorenzo Macchiavelli

web designer


Il giorno 04 gennaio 2013 14:54, Marco Beri marcob...@gmail.com ha
scritto:

 Chi indovina cosa stampa l'ultima riga di questo snippet senza eseguirlo?
 Si accettano tentativi :-)

 x = ([],)
 try:
 x[0] += [3]
 except TypeError:
 print += raised TypeError
 print x =, x

 Ciao.
 Marco.

 --
 http://beri.it/ - Un blog
 http://beri.it/i-miei-libri/ - Qualche libro


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


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


Re: [Python] Glitch

2013-01-04 Per discussione Marco Beri
2013/1/4 Lorenzo Macchiavelli lmacchiave...@gmail.com

 Non ho resistito!! :)


Strano, vero?

Chiaro, ha perfettamente senso una volta che ci ragioni. Ma di getto fa
specie...

Ciao.
Marco.


-- 
http://beri.it/ - Un blog
http://beri.it/i-miei-libri/ - Qualche libro
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Glitch

2013-01-04 Per discussione Marco Mariani
C'e' qualche motivo per cui non dovrebbe stampare ([3],) ?
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Glitch

2013-01-04 Per discussione Marco Mariani
Credo di capire. Il += viene eseguito in due passi, di cui il secondo
fallisce per TypeError
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Glitch

2013-01-04 Per discussione Marco Beri
2013/1/4 Marco Mariani bir...@gmail.com

 C'e' qualche motivo per cui non dovrebbe stampare ([3],) ?


Beh, a me ha fatto specie vedere che solleva l'eccezione *e* assegna il
valore.

A te no? :-)

Ciao.
Marco.

-- 
http://beri.it/ - Un blog
http://beri.it/i-miei-libri/ - Qualche libro
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Glitch

2013-01-04 Per discussione Marco Beri
2013/1/4 Marco Mariani bir...@gmail.com

 Credo di capire. Il += viene eseguito in due passi, di cui il secondo
 fallisce per TypeError


Esatto! :)

http://emptysquare.net/blog/python-increment-is-weird-part-ii/

Ciao.
Marco.

-- 
http://beri.it/ - Un blog
http://beri.it/i-miei-libri/ - Qualche libro
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Glitch

2013-01-04 Per discussione Gian Mario Tagliaretti
2013/1/4 Marco Beri marcob...@gmail.com:
 Chi indovina cosa stampa l'ultima riga di questo snippet senza eseguirlo? Si
 accettano tentativi :-)

Tentando di modificare la tupla sarei per un TypeError

 Ciao.
 Marco.

ciao
--
Gian Mario Tagliaretti
GNOME Foundation member
gia...@gnome.org
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Glitch

2013-01-04 Per discussione Marco Mariani
2013/1/4 Marco Beri marcob...@gmail.com

Beh, a me ha fatto specie vedere che solleva l'eccezione *e* assegna il
 valore.

 A te no? :-)


*meme warning*
Come molti qui dentro, ho scritto abbastanza javascript da non stupirmi
piu' di nulla.
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Glitch

2013-01-04 Per discussione Daniele Varrazzo

On 2013-01-04 14:54, Marco Beri wrote:
Chi indovina cosa stampa l'ultima riga di questo snippet senza 
eseguirlo?

Si accettano tentativi :-)


Credo di averlo letto, nominato come uno strano quirk di quando 
aggiunsero gli operatori inplace (Python 2.0 o 2.1...) La tupla 
bestemmia perché non accetta assegnamento ma la lista viene estesa lo 
stesso.



--
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] Glitch

2013-01-04 Per discussione Lorenzo Macchiavelli
Sinceramente non l'ho compreso!! :)

Lorenzo Macchiavelli

web designer


Il giorno 04 gennaio 2013 15:09, Daniele Varrazzo p...@develer.com ha
scritto:

 On 2013-01-04 14:54, Marco Beri wrote:

 Chi indovina cosa stampa l'ultima riga di questo snippet senza eseguirlo?
 Si accettano tentativi :-)


 Credo di averlo letto, nominato come uno strano quirk di quando aggiunsero
 gli operatori inplace (Python 2.0 o 2.1...) La tupla bestemmia perché non
 accetta assegnamento ma la lista viene estesa lo stesso.


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

 __**_
 Python mailing list
 Python@lists.python.it
 http://lists.python.it/**mailman/listinfo/pythonhttp://lists.python.it/mailman/listinfo/python

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


Re: [Python] Glitch

2013-01-04 Per discussione Daniele Varrazzo

On 2013-01-04 15:07, Andrea Ambu wrote:

OK questo e` _almeno_ controintuitivo.


Sì, lo è, è una piccola verruca :)

se sostituisci x[0] con a=x[0]; a oppure sostituendo la riga con 
+= con
x[0].__iadd__([3]) non lancia l'eccezione e fa quello che mi 
aspettavo

facesse il codice originale.

Cosa mi sto perdendo?


Il codice esegue sia iadd che setitem. Deve farlo perché non è detto 
che iadd non cambi oggetto: iadd della lista restituisce la lista stessa 
perché la cambia inplace, ma questo non è obbligatorio. Vedi 
http://docs.python.org/2/reference/datamodel.html#object.__iadd__


Il disassemblato spiega tutto:

 T = ([],)
 def f(t, x):
... t[0] += x
...
 f(T,[3])
Traceback (most recent call last):
  File stdin, line 1, in module
  File stdin, line 2, in f
TypeError: 'tuple' object does not support item assignment
 T
([3],)
 import dis
 dis.dis(f)
  2   0 LOAD_FAST0 (t)
  3 LOAD_CONST   1 (0)
  6 DUP_TOPX 2
  9 BINARY_SUBSCR
 10 LOAD_FAST1 (x)
 13 INPLACE_ADD
 14 ROT_THREE
 15 STORE_SUBSCR
 16 LOAD_CONST   0 (None)
 19 RETURN_VALUE

INPLACE_ADD chiama iadd della lista, che funziona, ma poi STORE_SUBSCR 
fallisce.


--
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] Glitch

2013-01-04 Per discussione Andrea Francia
2013/1/4 Marco Beri marcob...@gmail.com

 Chi indovina cosa stampa l'ultima riga di questo snippet senza eseguirlo?
 Si accettano tentativi :-)

 x = ([],)
 try:
 x[0] += [3]
 except TypeError:
 print += raised TypeError
 print x =, x


Ci provo:

... stack trace di un IndexError
x =([],)

Ciao
-- 
Andrea Francia http://andreafrancia.it
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Glitch

2013-01-04 Per discussione Andrea Francia
2013/1/4 Andrea Francia and...@andreafrancia.it

 Ci provo:
 ... stack trace di un IndexError


ops... avevo letto una x di troppo x[3] invece di [3] :)
Ecco un altro buon motivo per continuare ad usare i test, é troppo facile
per me farmi sfuggire cose del genere :)

Ciao

-- 
Andrea Francia http://andreafrancia.it
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Glitch

2013-01-04 Per discussione Nadir Sampaoli
Ciao a tutti,

-- Messaggio inoltrato --

 From: Marco Beri marcob...@gmail.com
 To: Discussioni generali sul linguaggio Python python@lists.python.it
 Cc:
 Date: Fri, 4 Jan 2013 15:01:12 +0100
 Chiaro, ha perfettamente senso una volta che ci ragioni. Ma di getto fa
 specie...


Per me non ha molto senso; potreste chiarirmi il dubbio?
Il fatto è che se l'operazione la faccio su un mutable tramite un'altra
variabile, giustamente il risultato colpisce l'elemento referenziato del
mutable originale:
 mutable = [[2]]
 temp = mutable[0]
 temp += [3]
 temp
[2, 3]
 mutable
[[2, 3]]

Nel caso della tupla:

- a priori mi aspetto una cosa del genere:
 immutable = [2],
 temp = immutable[0]
 temp += [3]
Traceback (most recent call last):
...

Mentre in realtà succede:
 immutable = [2],
 temp = immutable[0]
 temp += [3]
 temp
[2, 3]
 immutable
([2, 3],)
- a posteriori me lo spiego con il fatto che la tupla di per sè resta
immutata in quanto contiene solo il riferimento alla lista (tipo un
puntatore?), mentre viene modificata la lista (forse in place? Così che
il simil-puntatore non cambia) che non è parte integrante (i.e. non viene
influenzata nell'immutabilità del contenitore).

Delle due, una:
o la lista viene modificata, mentre non viene modificata la tupla in sè
(nel senso che le modifiche alla lista non riguardano l'immutabilità della
tupla), e quindi non ci sono eccezioni;
oppure viene sì sollevata l'eccezione, ma allora la mia lista resta
intonsa.
Invece non si verifica nessuno di questi due comportamenti.

(Per quel che vale, il comportamento che avrebbe più senso, per me, è il
primo)

Ciao.
 Marco.


Ciao!

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


Re: [Python] Glitch

2013-01-04 Per discussione Marco Beri
2013/1/4 Nadir Sampaoli nadirsampa...@gmail.com

 Delle due, una:
 o la lista viene modificata, mentre non viene modificata la tupla in
 sè (nel senso che le modifiche alla lista non riguardano l'immutabilità
 della tupla), e quindi non ci sono eccezioni;
 oppure viene sì sollevata l'eccezione, ma allora la mia lista resta
 intonsa.
 Invece non si verifica nessuno di questi due comportamenti.


In realtà succedono entrambe le cose, ma in momenti diversi (e successivi)
del codice disassemblato.

La lista viene modificata in place e poi, quando si cerca di assegnare il
puntatore dlla lista alla prima posizione della tupla, viene sollevata
l'eccezione ma oramai la modifica alla lista è stata fatta.

Il link che ho postato poi (e anche il messaggio di Daniele) spiegano
meglio di me la cosa.

Ciao.
Marco.

-- 
http://beri.it/ - Un blog
http://beri.it/i-miei-libri/ - Qualche libro
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python