python - 调用函数列表的最 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 的建议。如果每个函数返回一些值,并且我想使用前一个函数的返回值(无论它可能是什么)来决定我是否运行下一个函数,那么更一般的情况呢?每个函数也可能需要一些先前函数的返回值作为参数。
解决方案
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")
推荐阅读
- android - 最佳实践:res 文件夹 - Xdpi vs swXXXdp
- javascript - 无法导入 PapaParse
- javascript - 我的 DIV 调整器在触摸屏上不起作用
- java - 我如何拥有独立的 Java 控制台应用程序来打开带有登录页面的浏览器并阅读页面内容
- json - 比较两个嵌套字典并将它们的值的差异存储到一个新字典中
- java - 如何使用工厂为特定主题配置 Spring Kafka 侦听器?
- python - Pandas - 具有多个输出的 GroupBy
- python - 你能在 sorted() 中定义一个命名函数吗?
- jquery - Ajax:ajax 成功的未定义值
- php - 计算注册日期和 1 年之间的天数