Re: [Python] Glitch
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
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/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
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
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/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
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
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/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/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/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/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
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
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
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/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/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
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/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