Ho una comprensione di lista in Python in cui ogni iterazione può generare un'eccezione.Come posso gestire le eccezioni in una list comprehension in Python?
Per esempio, se ho:
eggs = (1,3,0,3,2)
[1/egg for egg in eggs]
Prendo un'eccezione ZeroDivisionError
nel 3 ° elemento.
Come posso gestire questa eccezione e continuare l'esecuzione della comprensione della lista?
L'unico modo che posso pensare è quello di utilizzare una funzione di supporto:
def spam(egg):
try:
return 1/egg
except ZeroDivisionError:
# handle division by zero error
# leave empty for now
pass
Ma questo sembra un po 'ingombrante per me.
C'è un modo migliore per farlo in Python?
Nota: Questo è un semplice esempio (vedi "per esempio" di cui sopra), che riuscii perché il mio esempio reale richiede un po 'di contesto. Non mi interessa evitare gli errori di divisione per zero, ma nel gestire le eccezioni nella comprensione di una lista.
C'è un [PEP 463] (https://www.python.org/dev/peps/pep-0463/) per aggiungere un'espressione per gestire le eccezioni. Nel tuo esempio sarebbe '[1/egg except ZeroDivisionError: None for egg in (1,3,0,3,2)]'. Ma è ancora in modalità bozza. Il mio istinto è che non sarà accettato. Le espressioni Imho possono diventare troppo disordinate (controllare più eccezioni, avere combinazioni più complesse (più operatori logici, complesse comprensioni, ecc.) – cfi
Si noti che per questo * specifico * esempio, si potrebbe usare un 'ndarray' numpy con le impostazioni appropriate in 'np. seterr' .Questo risulterebbe in '1/0 = nan' .Ma mi rendo conto che non generalizza ad altre situazioni in cui si presenta questa esigenza – gerrit