我想在另一个之后执行许多功能。每个函数返回True或False。因此,如果一个函数返回True,我想执行下一个函数。等...
所有功能都没有必要相同的参数。
现在我有类似的东西:
res=function1()
if res:
res=function2()
if res:
res=function2()
它继续执行20个功能。有更好的方法吗?
提前谢谢你......
答案 0 :(得分:8)
嗯,你可以定义自己的方法来做到这一点,但我会这样做:
my_functions = (
(my_func1, [2, 5], {'kwarg1': 'val1'}),
# ...
)
for function, args, kwargs in my_functions:
if not function(*args, **kwargs):
break
根据评论编辑。很有见地!
答案 1 :(得分:4)
我可能会使用partial
来创建可以循环的零参数函数(而不是函数及其参数的某种结构):
functions = [
functools.partial(func1, arg1a, arg1b),
functools.partial(func2),
functools.partial(func3, keyword_a=kwarg3a, keyword_b=kwarg3b)
]
然后,您可以拨打all
,而不是将其放入list
并对其进行迭代:
retval = all(func() for func in (
functools.partial(func1, arg1a, arg1b),
functools.partial(func2),
functools.partial(func3, keyword_a=kwarg3a, keyword_b=kwarg3b)
))
一旦其中一个函数返回False
(或任何false-y),它将返回False
,或者运行所有函数并返回True
如果它们全部返回{ {1}}(或任何真实的)。正如文档所说,它等同于:
True
值得比较另一个答案中的def all(iterable):
for element in iterable:
if not element:
return False
return True
和partial
s,它们作为伪部分,无论是如何定义它们以及它们如何被调用:
tuple
显然你可以(并且应该像aemdy的回答那样)通过元组解包使调用更具可读性,但它仍然不会像使用真正的部分一样简单。
答案 2 :(得分:2)
您可以利用and
运算符的短路行为:
function1() and function2() and function3() and ...
仅当function2
返回function1
时才会调用 True
,function3
仅在function1
和function2
返回{{1}时才会被调用等等。
但它不一定非常Pythonic。
由于您总是分配给True
,因此您也可以保持res
平坦:
if
这可能被认为更具可读性,但它确实浪费了大量的垂直空间。不过,至少你没有嵌套res = function1()
if res:
res = function2()
if res:
res = function3()
二十几个。
答案 3 :(得分:1)
没有必要变得太复杂:
res = function1()
res = res and function2()
res = res and function3()
...
这看起来有点奇怪,但会做你想要的,而不必扭曲函数调用自己到词典或其他东西的列表。这只是写Cairnarvon答案的一种较长的方式:
res = (
function1() and
function2() and
function3() and
...
)