Re: [Python] liste in Python errore costruzione matrice

2013-06-04 Per discussione Daniele San Giovanni
Ho fatto al momento la prima modifica e non viene più sollevata l'
eccezione. Quindi dovrebbe andar bene.
Ho però un altro dubbio:
Quando eseguofor i in range(0, len(self.ArrChartData) - 1):

se len(self.ArrChartData) è 0  voglio che il ciclo for non venga eseguito.
se len(self.ArrChartData) è 1  voglio che il ciclo for non venga eseguito
una sola volta con k=0
se len(self.ArrChartData) è 3 voglio che il ciclo for non venga eseguito
tre volte con k=0, 1, 2

Si comporta proprio così?

Grazie





Il giorno 04 giugno 2013 02:02, Federico Figus
ha scritto:

> Ciao,
>
> il problema deriva dal fatto che ret è una lista vuota, quindi quando
> cerchi di accedere al suo element ret[k] viene giustamente sollevata
> un'eccezione IndexError proprio perchè il k-esimo elemento non esiste
> (essendo una lista vuota).
>
> Se ho capito bene, ret dovrà essere sempre una lista di
> len(self.ArrChartConfig) - 1 dizionari, che al proprio interno avranno un
> indice 'data' associato ad una lista di len(self.ArrChartData) - 1 liste
> di due elementi, allora dovresti inserire all'inizio del primo ciclo:
>
> ret.append({'data': []})
>
> per poi fare un
>
> ret[k]['data'].append([xval, yval])
>
> al posto della riga che solleva l'eccezione.
>
> A mio parere questo metodo non sarebbe ottimale, sia dal punto di vista
> prestazionale (sia in termini di memoria che temporali) sia da quello
> stilistico, potresti utilizzare le list comprehension per ottenere un
> ottimo risultato:
>
>
> def chart(self):
> return [{'data': [[coords[0], coords[1]] for coords in
> self.ArrChartData[:-1]]}
>   for _ in xrange(0, len(self.ArrChartConfig) - 1)]
>
> nel caso l'iterable self.ArrCharData contenga solo tuple o liste da 2
> elementi potresti anche scrive in questo modo
>
> def chart(self):
> return [{'data': [[x, y] for x, y in self.ArrChartData[:-1]]}
>   for _ in xrange(0, len(self.ArrChartConfig) - 1)]
>
>
> Spero di averti dato una mano con la risoluzione del tuo problema, fammi
> sapere se funziona (e nel caso di errori dove ho sbagliato) o se c'è
> qualche passaggio non molto chiaro.
> Spero che il sonno non mi abbia giocato qualche brutto scherzo ;)
>
> P.S. se la coppia di coordinate non dovrai modificarla in futuro,  ti
> consiglio di usare una tupla per contenerle quindi (val[0], val[1])
>
> Saluti,
> Federico Figus
>
> ___
> Python mailing list
> Python@lists.python.it
> http://lists.python.it/mailman/listinfo/python
>
>


-- 
Daniele San Giovanni
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] liste in Python errore costruzione matrice

2013-06-04 Per discussione Daniele San Giovanni
errata corrige:

se len(self.ArrChartData) è 3 voglio che il ciclo for  venga eseguito tre
volte con k=0, 1, 2


Il giorno 04 giugno 2013 10:05, Daniele San Giovanni <
sangiovanni.dani...@gmail.com> ha scritto:

> Ho fatto al momento la prima modifica e non viene più sollevata l'
> eccezione. Quindi dovrebbe andar bene.
> Ho però un altro dubbio:
> Quando eseguofor i in range(0, len(self.ArrChartData) - 1):
>
> se len(self.ArrChartData) è 0  voglio che il ciclo for non venga
> eseguito.
> se len(self.ArrChartData) è 1  voglio che il ciclo for non venga eseguito
> una sola volta con k=0
> se len(self.ArrChartData) è 3 voglio che il ciclo for non venga eseguito
> tre volte con k=0, 1, 2
>
> Si comporta proprio così?
>
> Grazie
>
>
>
>
>
> Il giorno 04 giugno 2013 02:02, Federico Figus ha 
> scritto:
>
>> Ciao,
>>
>> il problema deriva dal fatto che ret è una lista vuota, quindi quando
>> cerchi di accedere al suo element ret[k] viene giustamente sollevata
>> un'eccezione IndexError proprio perchè il k-esimo elemento non esiste
>> (essendo una lista vuota).
>>
>> Se ho capito bene, ret dovrà essere sempre una lista di
>> len(self.ArrChartConfig) - 1 dizionari, che al proprio interno avranno un
>> indice 'data' associato ad una lista di len(self.ArrChartData) - 1 liste
>> di due elementi, allora dovresti inserire all'inizio del primo ciclo:
>>
>> ret.append({'data': []})
>>
>> per poi fare un
>>
>> ret[k]['data'].append([xval, yval])
>>
>> al posto della riga che solleva l'eccezione.
>>
>> A mio parere questo metodo non sarebbe ottimale, sia dal punto di vista
>> prestazionale (sia in termini di memoria che temporali) sia da quello
>> stilistico, potresti utilizzare le list comprehension per ottenere un
>> ottimo risultato:
>>
>>
>> def chart(self):
>> return [{'data': [[coords[0], coords[1]] for coords in
>> self.ArrChartData[:-1]]}
>>   for _ in xrange(0, len(self.ArrChartConfig) - 1)]
>>
>> nel caso l'iterable self.ArrCharData contenga solo tuple o liste da 2
>> elementi potresti anche scrive in questo modo
>>
>> def chart(self):
>> return [{'data': [[x, y] for x, y in self.ArrChartData[:-1]]}
>>   for _ in xrange(0, len(self.ArrChartConfig) - 1)]
>>
>>
>> Spero di averti dato una mano con la risoluzione del tuo problema, fammi
>> sapere se funziona (e nel caso di errori dove ho sbagliato) o se c'è
>> qualche passaggio non molto chiaro.
>> Spero che il sonno non mi abbia giocato qualche brutto scherzo ;)
>>
>> P.S. se la coppia di coordinate non dovrai modificarla in futuro,  ti
>> consiglio di usare una tupla per contenerle quindi (val[0], val[1])
>>
>> Saluti,
>> Federico Figus
>>
>> ___
>> Python mailing list
>> Python@lists.python.it
>> http://lists.python.it/mailman/listinfo/python
>>
>>
>
>
> --
> Daniele San Giovanni
>



-- 
Daniele San Giovanni
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] liste in Python errore costruzione matrice

2013-06-04 Per discussione Federico Figus
>
> Quando eseguofor i in range(0, len(self.ArrChartData) - 1):
>
> se len(self.ArrChartData) è 0  voglio che il ciclo for non venga
> eseguito.
> se len(self.ArrChartData) è 1  voglio che il ciclo for non venga eseguito
> una sola volta con k=0
>

 se len(self.ArrChartData) è 3 voglio che il ciclo for  venga eseguito tre
> volte con k=0, 1, 2


Nel tuo caso avrai:
se len(self.ArrCharData) == 0 allora avrai range(0, -1) cioè []
se len(self.ArrCharData) == 1 allora avrai range(0, 0) cioè []
se len(self.ArrCharData) == 2 allora avrai range(0, 1) cioè [0]
se len(self.ArrCharData) == 3 allora avrai range(0, 2) cioè [0, 1]

se vuoi evitare che il ciclo venga eseguito per len(self.ArrCharData) uguale
a 0 o a 1, allora ti consiglio di mettere prima del ciclo queste due righe
di codice:

if len(self.ArrCharData) < 2:
continue

Altro piccolo consiglio, quando ti serve un contatore usa xrange() al posto
di range(), il primo rende un generator il secondo una list. In più non hai
bisogno di specificare 0 visto che parte sempre da zero se non specifichi
due argomenti, quindi:
range(n) -> [0, 1, , n-1]
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


[Python] Overloading "print"

2013-06-04 Per discussione Vittorio Spina
Salve a tutti, ho un programma di decine di migliaia di righe di codice 
che spesso e volentieri utilizza print come output di debug, pur avendo 
un'interfaccia windowed.
Come faccio a fare l'overloading del print in modo da non dover 
eliminare tutti i print presenti nel codice?
C' un modo semplice per ridefinire la funzione print in modo ad esempio 
che stampi in console solo se un certo booleano è true?

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


Re: [Python] Overloading "print"

2013-06-04 Per discussione Marco De Paoli
Il giorno 04 giugno 2013 16:26, Vittorio Spina
ha scritto:

> Come faccio a fare l'overloading del print in modo da non dover eliminare
> tutti i print presenti nel codice?
>

puoi provare ridefinendo lo stdout

import sys
sys.stdout = open('file', 'w')
print 'test'

vedi qui:
http://stackoverflow.com/questions/4675728/redirect-stdout-to-a-file-in-python

e qui:
http://stackoverflow.com/questions/1218933/can-i-redirect-the-stdout-in-python-into-some-sort-of-string-buffer

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


Re: [Python] Overloading "print"

2013-06-04 Per discussione Vittorio Spina

Il 04/06/2013 16:29, Marco De Paoli ha scritto:



Il giorno 04 giugno 2013 16:26, Vittorio Spina 
mailto:vittorio.sp...@gmail.com>> ha scritto:


Come faccio a fare l'overloading del print in modo da non dover
eliminare tutti i print presenti nel codice?


puoi provare ridefinendo lo stdout

import sys
sys.stdout = open('file', 'w')
print 'test'

vedi qui:
http://stackoverflow.com/questions/4675728/redirect-stdout-to-a-file-in-python

e qui:
http://stackoverflow.com/questions/1218933/can-i-redirect-the-stdout-in-python-into-some-sort-of-string-buffer

ciao,
Marco

perfetto, grazie mille.



___
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] Overloading "print"

2013-06-04 Per discussione Federico Figus
Ciao,

l'override dell'istruzione print non è possibile in python 2.x, ma lo è in
python 3.x.
Per aggirare il problema potresti definire un file-like object che possieda
almeno il metodo write, al cui interno ci implementi la logica di scritura,
ad esempio:

import sys
_stdout = sys.stdout

class FaskeStdout(object):

can_write = 1

def write(self, data):
if self.can_write:
_stdout.write(data)

sys.stdout = FakeStdout()

print "stampa sullo stdout"
sys.stdout.can_write = 0
print "non stampa sullo stdout"

La seconda soluzione sarebbe creare la tua funzione print con un alias
(e.g. print_log()) e modidicare tutto il codice con un semplice
find&replace, così potrai controllare la meglio tutta questa parte in
futuro.

Saluti,
Federico F.
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Overloading "print"

2013-06-04 Per discussione Vittorio Spina

Il 04/06/2013 17:03, Federico Figus ha scritto:

Ciao,

l'override dell'istruzione print non è possibile in python 2.x, ma lo 
è in python 3.x.
Per aggirare il problema potresti definire un file-like object che 
possieda almeno il metodo write, al cui interno ci implementi la 
logica di scritura, ad esempio:


import sys
_stdout = sys.stdout

class FaskeStdout(object):

can_write = 1

def write(self, data):
if self.can_write:
_stdout.write(data)

sys.stdout = FakeStdout()

print "stampa sullo stdout"
sys.stdout.can_write = 0
print "non stampa sullo stdout"

La seconda soluzione sarebbe creare la tua funzione print con un alias 
(e.g. print_log()) e modidicare tutto il codice con un semplice 
find&replace, così potrai controllare la meglio tutta questa parte in 
futuro.
ho pensato a fare un overloading perchè non e' semplice cambiare tutti i 
print con un find&replace.

la riga

   print "ciao mondo"

dovrebbe diventare

   print_log("ciao mondo")

e l'ultima parentesi tonda chiusa non saprei proprio come inserirla...
Con il file-like object del print ha funzionato, adesso ho un flag che 
funziona così:


   if not flag:
print "Verbose is OFF!!!"
from overloadprint import *
sys.stdout=OverloadPrint()


dove overloading.py contiene il codice:

   class OverloadPrint():
def write(self, text):
pass



Saluti,
Federico F.


___
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] Overloading "print"

2013-06-04 Per discussione Marco De Paoli
Il giorno 04 giugno 2013 17:08, Vittorio Spina
ha scritto:

> cambiare tutti i print con un find&replace.
> la riga
>
> print "ciao mondo"
>
> dovrebbe diventare
>
> print_log("ciao mondo")
>
> e l'ultima parentesi tonda chiusa non saprei proprio come inserirla...
>
> se sei in vim puoi fare una cosa del genere
:%s/print "\(.*\)"/print("\1")/

la parentesi nell'espressione regolare crea un group che poi puoi
riutilizzare nella parte di replace
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Overloading "print"

2013-06-04 Per discussione Marco Beri
2013/6/4 Vittorio Spina 

 ho pensato a fare un overloading perchè non e' semplice cambiare tutti i
> print con un find&replace.
> la riga
>
> print "ciao mondo"
>
> dovrebbe diventare
>
> print_log("ciao mondo")
>
> e l'ultima parentesi tonda chiusa non saprei proprio come inserirla...
>

Il comando di Marco funziona ma solo se stampi una stringa e basta, se vuoi
stampare anche una variabile devi usare questo:

:%s/\ in vim corrispondono al \b delle regex

-- 
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] Overloading "print"

2013-06-04 Per discussione Marco De Paoli
Il giorno 04 giugno 2013 17:22, Marco Beri  ha scritto:
>
> :%s/\
> uhm, i doppi-apici dentro le parentesi di print_log non mi tornano tanto...

secondo me non ci vanno:
:%s/\___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Overloading "print"

2013-06-04 Per discussione Marco Beri
2013/6/4 Marco De Paoli 

>
> Il giorno 04 giugno 2013 17:22, Marco Beri  ha
> scritto:
>
>>  :%s/\>
>>  uhm, i doppi-apici dentro le parentesi di print_log non mi tornano
> tanto...
>
> secondo me non ci vanno:
> :%s/\

Ovviamente hai ragione!!!

Avevo preso la tua istruzione per correggerla e non li ho tolti.

Grazie! :-)

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] Overloading "print"

2013-06-04 Per discussione Marco De Paoli
Il giorno 04 giugno 2013 17:29, Marco Beri  ha scritto:

> Avevo preso la tua istruzione per correggerla e non li ho tolti.
>

incredibile!
... trovare un baco al Beri sulle istruzioni regolari?!?
Non ha prezzo! :-)

per i posteri: confermo che la forma di marcoberi è decisamente più generale

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


Re: [Python] Overloading "print"

2013-06-04 Per discussione Marco Beri
2013/6/4 Marco De Paoli 

> Il giorno 04 giugno 2013 17:29, Marco Beri  ha
> scritto:
>
> Avevo preso la tua istruzione per correggerla e non li ho tolti.
>>
>
> incredibile!
> ... trovare un baco al Beri sulle istruzioni regolari?!?
> Non ha prezzo! :-)
>

:-D

Meno male che la lista la leggono in tre o quattro...


-- 
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] Overloading "print"

2013-06-04 Per discussione Daniele Varrazzo
On Tue, 2013-06-04 at 17:08 +0200, Vittorio Spina wrote:

> la riga
> 
> print "ciao mondo"
> 
> dovrebbe diventare
> 
> print_log("ciao mondo")

Se hai deciso di eliminare tutti i print (cosa che consiglio alla
grande), penso che la cosa migliore sia sostituirli con logging.info (o
logging.debug).

Quello che stai facento è un logging fatto a mano: dai un'occhiata al
modulo per vedere se ha feature che ti possono interessare:
http://docs.python.org/2/library/logging.html


-- 
Daniele

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


Re: [Python] Overloading "print"

2013-06-04 Per discussione Carlo Miron
Il 04 giugno 2013 18:01, Marco Beri  ha scritto::

> 2013/6/4 Marco De Paoli 
>> Il giorno 04 giugno 2013 17:29, Marco Beri  ha
>> scritto:
>>> Avevo preso la tua istruzione per correggerla e non li ho tolti.
>>
>> incredibile!
>> ... trovare un baco al Beri sulle istruzioni regolari?!?
>> Non ha prezzo! :-)
>
> :-D
> Meno male che la lista la leggono in tre o quattro...

Si`, ma sono i tre o quattro che contano ;)

Non ho tempo di provare la tua RE, ma sarei curioso di sapere come si
comporta con::

  print senza_andare_a_capo,
  print con #commento in linea
  print "concatenando"\
  " due stringhe"
  print """due
  righe"""
  # print da sola
  print
  print >> file, qualcosa

:-?

-- © 2013
::

R
 K--S
L
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Overloading "print"

2013-06-04 Per discussione Marco Beri
2013/6/4 Carlo Miron 

> Non ho tempo di provare la tua RE, ma sarei curioso di sapere come si
> comporta con::
>
>   print senza_andare_a_capo,
>   print con #commento in linea
>   print "concatenando"\
>   " due stringhe"
>   print """due
>   righe"""
>   # print da sola
>   print
>   print >> file, qualcosa
>


  print_log(senza_andare_a_capo,)
  print_log(con #commento in linea)
  print_log("concatenando"\)
  " due stringhe"
  print_log("""due)
  righe"""
  # print_log(da sola)
  print
  print_log(>> file, qualcosa)


Direi che toppa praticamente sempre :-)

Ma chissenefrega, solo un aspie potrebbe usare la print in quel modo.

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] Overloading "print"

2013-06-04 Per discussione Vittorio Spina

  print_log(senza_andare_a_capo,)

  print_log(con #commento in linea)
  print_log("concatenando"\)
  " due stringhe"
  print_log("""due)
  righe"""
  # print_log(da sola)
  print
  print_log(>> file, qualcosa)


Direi che toppa praticamente sempre :-)

Ma chissenefrega, solo un _*aspie*_ potrebbe usare la print in quel modo.

questa potevi evitartela

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


Re: [Python] Overloading "print"

2013-06-04 Per discussione Marco Beri
2013/6/4 Vittorio Spina 

>print_log(senza_andare_a_capo,)
>
> print_log(con #commento in linea)
>   print_log("concatenando"\)
>" due stringhe"
>   print_log("""due)
>righe"""
>   # print_log(da sola)
>   print
>   print_log(>> file, qualcosa)
>
>
>  Direi che toppa praticamente sempre :-)
>
>  Ma chissenefrega, solo un *aspie* potrebbe usare la print in quel modo.
>
> questa potevi evitartela
>

Boh, non direi.

Un sospetto aspie è Sheldon Cooper per esempio:
http://en.wikipedia.org/wiki/Sheldon_Cooper

Ad ogni modo se ho offeso te o qualcun'altro me ne dispiaccio.

Per esempio avrei potuto dire "solo un cretino" e probabilmente si
sarebbero sentite offese, a torto, molte meno persone.

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