У меня была функция, которая возвращала случайного члена нескольких групп в порядке предпочтения.Это выглядело примерно так:
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"
Однако первое, что get_random_foo
делает, это проверяет, есть ли foos, и поднимает IndexError
, если нет, поэтому there_are_foos
является избыточным.Кроме того, база данных задействована, и использование отдельных функций создает проблему параллелизма.Соответственно, я переписал это примерно так:
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"
Но я нахожу это гораздо менее читабельным, и, поскольку у меня никогда не было причин использовать pass
, прежде чем он будет казаться инстинктивно неправильным.
Есть ли более эффективный шаблон или я должен научиться принимать pass
?
Примечание: я бы хотел избежать вложенности, так как другие типы могут быть добавлены позже.
Редактировать
Спасибо всем, кто сказал, что pass
хорошо - это обнадеживает!
Также спасибо тем, кто предложил заменить исключение на возвращаемое значение None
.Я вижу, насколько это полезный шаблон, но я бы сказал, что в этой ситуации он семантически неверен: функциям было предложено выполнить невыполнимую задачу, поэтому они должны вызвать исключение.Я предпочитаю следить за поведением модуля random
(например, random.choice([])
).