如何一个接一个地执行许多功能

时间:2013-02-26 19:46:22

标签: python

我想在另一个之后执行许多功能。每个函数返回True或False。因此,如果一个函数返回True,我想执行下一个函数。等...

所有功能都没有必要相同的参数。

现在我有类似的东西:

res=function1()
if res:
   res=function2()
   if res:
      res=function2()

它继续执行20个功能。有更好的方法吗?

提前谢谢你......

4 个答案:

答案 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时才会调用

Truefunction3仅在function1function2返回{{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
   ...
   )