【发布时间】:2010-09-16 02:28:45
【问题描述】:
我有一个函数,它按优先顺序返回几个组的随机成员。它是这样的:
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 所做的第一件事是验证是否存在 foo,如果没有,则提出 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([]))。
【问题讨论】:
-
except语句中的使用可能是 Python 中pass最常见的使用。所以我会习惯的。 -
“但我发现这不太可读……感觉本能地错误”——把它当作一个文化问题。现在看起来很奇怪,但这是使用该语言的最简洁的方式。
标签: python exception-handling coding-style