python – 除了: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"

但是,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之前感到错误.

是否有更整洁有效的模式,还是我应该学会接受通行证?

注意:我想避免任何嵌套,因为以后可能会添加其他类型.

编辑

谢谢大家说通行证很好 – 这让人放心!

还要感谢那些建议用返回值None替换异常的人.我可以看到这是一个有用的模式,但我认为在这种情况下它在语义上是错误的:已经要求函数执行一个不可能完成的任务,因此它们应该引发异常.我更喜欢遵循随机模块的行为(例如random.choice([])).

最佳答案
这正是我写它的方式.这很简单,也很有道理.我认为传递语句没有问题.

如果您想减少重复次数并且预计会添加未来类型,则可以将其转换为循环.然后你可以将传递更改为功能相当的continue语句,如果这更令你满意:

for getter in (get_random_foo, get_random_bar):
    try:
        return getter()
    except IndexError:
        continue  # Ignore the exception and try the next type.

raise IndexError, "No foos, no bars"

转载注明原文:python – 除了:pass`之外还有一个更简洁的替代品吗? - 代码日志