首页 > 解决方案 > 调用函数列表的最 Pythonic 方式

问题描述

我有一个函数列表,如下所示:

def foo(a, b):
    # do stuff
    return True # or False

def bar(c):
    # do stuff
    return False # or True

def baz(d, e, f):
    # do stuff
    return True # or False

我想依次调用它们中的每一个,并且只有在前一个返回时才继续进行下一个True,如下所示:

if foo(1, 2):
    if bar(3):
        if baz(4, 5, 6):
            print("Success!")

现在,我知道如果我的所有函数都接受相同的参数,我可以执行以下操作:

steps = [foo, bar, baz]
if all(func(*args) for func in steps):
    print("Success!")

因为all一旦达到False返回值就会短路。但是,它们并不都接受相同的论点。

实现这一目标的最干净的方法是什么?

编辑:感谢有关压缩 args 的建议。如果每个函数返回一些值,并且我想使用前一个函数的返回值(无论它可能是什么)来决定我是否运行下一个函数,那么更一般的情况呢?每个函数也可能需要一些先前函数的返回值作为参数。

标签: pythonpython-3.x

解决方案


and运算符也会短路,因此您可以执行以下操作:

if foo(1, 2) and bar(3) and baz(4, 5, 6):
    print("Success")

如果您想要更通用的方法,可以列出 lambdas。

steps = [
    lambda: foo(1, 2), 
    lambda: bar(3), 
    lambda: baz(4, 5, 6)
]
if all(f() for f in steps):
    print("Success")

或元组列表:

steps = [
    (foo, (1, 2)), 
    (bar, (3)), 
    (baz, (4, 5, 6))
]
if all(f(*args) for f, args in steps):
    print("Success")

推荐阅读