Avevo una funzione che restituiva un membro casuale di più gruppi in ordine di preferenza. E 'andato qualcosa di simile:Esiste un'alternativa più ordinata a "except: pass`?
def get_random_foo_or_bar():
"I'd rather have a foo than a bar."
if there_are_foos():
return get_random_foo()
if there_are_bars():
return get_random_bar()
raise IndexError, "No foos, no bars"
Tuttavia, la prima cosa che fa è get_random_foo
verificare ci sono ambrose e sollevano un IndexError
se non, in modo da there_are_foos
è ridondante. Inoltre, è coinvolto un database e l'utilizzo di funzioni separate crea un problema di concorrenza. Di conseguenza, ho riscritto qualcosa di simile:
def get_random_foo_or_bar():
"Still prefer foos."
try:
return get_random_foo()
except IndexError:
pass
try:
return get_random_bar()
except IndexError:
pass
raise IndexError, "No foos, no bars"
Ma trovo questo molto meno leggibile, e come non ho mai avuto motivo di usare pass
prima che si sente istintivamente sbagliato.
C'è un modello più ordinato efficiente, o dovrei imparare ad accettare pass
?
Nota: vorrei evitare ogni nidificazione in quanto altri tipi possono essere aggiunti in seguito.
Modifica
ringrazia tutti coloro che hanno detto che pass
va bene - questo è rassicurante!
anche grazie a chi ha suggerito di sostituire l'eccezione con un valore di ritorno di None
. Posso vedere come questo sia uno schema utile, ma direi che è semanticamente sbagliato in questa situazione: alle funzioni è stato chiesto di eseguire un'attività impossibile in modo che dovessero sollevare un'eccezione. Preferisco seguire il comportamento del modulo random
(ad esempio random.choice([])
).
L'uso di 'dichiarazioni except' è probabilmente l'uso più comune di' pass' in Python. Quindi mi ci abituerei. –
"Ma trovo questo molto meno leggibile ... si sente istintivamente sbagliato" - pensalo come una questione culturale. Sembra strano ora, ma è il modo più pulito di usare la lingua. – detly