[Python] C'e' un modo per abbreviare questa sintassi?

Nicola Larosa nico a tekNico.net
Mer 7 Nov 2012 15:17:46 CET


> orsomannaro wrote:
>> Infatti per ora ho risolto cosi':
>>
>> def str2int(str): return int(str) if str.isdigit() else None
>>
>> numero1 = str2int(get_num(...))
>> numero2 = str2int(get_num(...))
>> numero3 = str2int(get_num(...))
>> ...
>> if numero1 and numero2 and numero3 and ...:
>>         my_obj.codice1 = numero1
>>         my_obj.codice2 = numero2
>>         my_obj.codice3 = numero3

No, no, no, che orrore. Blindare la cardinalità dei dati nel codice in
questo modo è una bestemmia. I fondamentali, per cortesia.


Stefano Dal Pra wrote:
> Ciao, ti propongo questa variante:
> 
> str2int = lambda str : str.isdigit() and int(str)
> n = 0
> while True:
>     n += 1
>     k = str2int(get_num)
>     if not k: break
>     setattr(my_obj, 'codice%s'%n, k)

E questa implementa in modo diverso parte dei presupposti sbagliati della
precedente.


Un buon approccio è quello di Marco M., col suo elegante uso di yield per
separare il concern dell'estrazione dei numeri da quello della loro
successiva elaborazione. Come Gianni V., neanch'io userei isdigit ma
proverei direttamente a trasformare le stringhe in numeri, ed userei un
valore sentinella ritornato da get_num, ad esempio None, per terminare
l'elaborazione:

>>> def iter_numeri():
...     while True:
...         val = get_num()
...         if val is None:
...             raise StopIteration
...         try:
...             yield int(val)
...         except ValueError:
...             pass
...
... for num in iter_numeri():
...     elabora_numero(num)

Si potrebbe anche semplificare sollevando StopIteration direttamente
dentro get_num ma non mi piace, mischia i livelli.

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

The invisible hand of the free market, it turns out,
is attached to an invisible idiot.
 - Dmitry Orlov, April 2012



Maggiori informazioni sulla lista Python