我有一个方法,按顺序调用其他4个方法来检查特定的条件,并立即返回(不检查以下那些)每当一个返回一些真理。

def check_all_conditions():
    x = check_size()
    if x:
        return x

    x = check_color()
    if x:
        return x

    x = check_tone()
    if x:
        return x

    x = check_flavor()
    if x:
        return x
    return None

这似乎是一大堆行李规定。而不是每个2行if语句,我宁愿这样做:

x and return x

但这是无效的Python。我是不是错过了一个简单、优雅的解决方案?顺便说一句,在这种情况下,这四个检查方法可能代价很高,所以我不想多次调用它们。


当前回答

理想情况下,我将重写check_函数以返回True或False而不是一个值。你的支票就变成了

if check_size(x):
    return x
#etc

假设你的x不是不可变的,你的函数仍然可以修改它(尽管他们不能重新分配它)-但是一个叫check的函数不应该真的修改它。

其他回答

上面的Martijns的第一个例子略有变化,避免了循环中的if:

Status = None
for c in [check_size, check_color, check_tone, check_flavor]:
  Status = Status or c();
return Status

不要改变它

还有其他的方法来做这个,正如各种其他的答案所显示的。没有一个像原始代码那样清晰。

理想情况下,我将重写check_函数以返回True或False而不是一个值。你的支票就变成了

if check_size(x):
    return x
#etc

假设你的x不是不可变的,你的函数仍然可以修改它(尽管他们不能重新分配它)-但是一个叫check的函数不应该真的修改它。

python的方法是使用reduce(有人已经提到过)或itertools(如下所示),但在我看来,简单地使用或操作符的短路可以产生更清晰的代码

from itertools import imap, dropwhile

def check_all_conditions():
    conditions = (check_size,\
        check_color,\
        check_tone,\
        check_flavor)
    results_gen = dropwhile(lambda x:not x, imap(lambda check:check(), conditions))
    try:
        return results_gen.next()
    except StopIteration:
        return None

实际上与timgeb的答案相同,但你可以使用括号来更好地格式化:

def check_all_the_things():
    return (
        one()
        or two()
        or five()
        or three()
        or None
    )