J'ai eu une fonction qui a retourné un membre aléatoire de plusieurs groupes dans l'ordre de préférence. Il a quelque chose comme ceci:Existe-t-il une alternative plus propre à `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"
Cependant, la première chose que get_random_foo
fait est de vérifier il y a foos et soulèvent un IndexError
sinon, si there_are_foos
est redondant. De plus, une base de données est impliquée et l'utilisation de fonctions séparées crée un problème de simultanéité. Par conséquent, je réécrite quelque chose comme ceci:
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"
Mais je trouve cela beaucoup moins lisible, et comme je ne l'ai jamais eu raison d'utiliser pass
avant qu'il ne se sent instictively mal.
Y a-t-il un modèle plus efficace ou devrais-je apprendre à accepter pass
?
Remarque: Je souhaite éviter toute imbrication car d'autres types peuvent être ajoutés ultérieurement.
Modifier
Merci tout le monde qui a dit que pass
est très bien - c'est rassurant!
Merci également à ceux qui ont suggéré de remplacer l'exception par une valeur de retour de None
. Je peux voir comment c'est un modèle utile, mais je dirais que c'est sémantiquement faux dans cette situation: les fonctions ont été invitées à effectuer une tâche impossible, donc ils devraient lever une exception. Je préfère suivre le comportement du module random
(par exemple random.choice([])
).
L'utilisation dans 'déclarations except' est probablement l'utilisation la plus courante de' pass' en Python. Donc, je m'y habituerais. –
"Mais je trouve cela beaucoup moins lisible ... ça sent instinctivement mal" - je pense qu'il s'agit d'un problème culturel. Cela semble étrange maintenant, mais c'est la façon la plus propre d'utiliser la langue. – detly