Tenía una función que devolvía un miembro aleatorio de varios grupos en orden de preferencia. Fue algo como esto:¿Existe una alternativa más ordenada 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"
Sin embargo, lo primero que hace es verificar get_random_foo
hay Foos y plantean una IndexError
si no, por lo there_are_foos
es redundante. Además, una base de datos está involucrada y el uso de funciones separadas crea un problema de concurrencia. En consecuencia, Reescribí que algo como esto:
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"
Pero Me parece mucho menos legible, y ya que nunca he tenido razón para utilizar pass
antes de que se siente instictively mal.
¿Existe un patrón más eficiente, o debo aprender a aceptar pass
?
Nota: Me gustaría evitar cualquier anidación ya que se pueden agregar otros tipos más adelante.
Editar
Gracias a todos los que dijeron que pass
está bien - eso es tranquilizador!
También gracias a aquellos que sugirieron reemplazar la excepción con un valor de retorno de None
. Puedo ver cómo este es un patrón útil, pero yo diría que es semánticamente incorrecto en esta situación: se les ha pedido a las funciones que realicen una tarea imposible, por lo que deben hacer una excepción. Prefiero seguir el comportamiento del módulo random
(por ejemplo, random.choice([])
).
El uso de 'declaraciones except' es probablemente el uso más común de' pass' en Python. Entonces me acostumbraría. –
"Pero me parece mucho menos legible ... se siente instintivamente mal", piense en ello como un problema cultural. Parece extraño ahora, pero es la forma más limpia de usar el lenguaje. – detly