2013-02-26 150 views
1

我想要执行多个函数。每个函数都返回True或False。所以如果一个函数返回True,我想执行下一个函数。 etc ...如何依次执行多个函数

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

现在我有这样的:

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

它的推移和像20层的功能。有一个更好的方法吗 ?

预先感谢您...

回答

8

好了,你可以定义自己的方式做到这一点,但我会做这样的:

my_functions = (
    (my_func1, [2, 5], {'kwarg1': 'val1'}), 
    # ... 
) 

for function, args, kwargs in my_functions: 
    if not function(*args, **kwargs): 
     break 

根据注释编辑。伟大的见解!

+1

如果元组来代替它也可以写成一本字典: '对于f,指定参数时,kwargs在my_functions: 如果不是F(*指定参数时, ** kwargs): break' 虽然效果相同 – 2013-02-26 20:03:26

+0

@abarnert原始版本是一个列表,但现在我已将它更改为元组。 – aemdy 2013-02-26 20:13:33

2

你可以采取and运营商的短路行为的优势:

function1() and function2() and function3() and ... 

如果function1返回Truefunction2才会被调用,function3只会如果function1function2返回True等等。

虽然它并不一定是非常的Pythonic。

因为你总是分配给res,也可以只保留if小号平:

res = function1() 

if res: 
    res = function2() 

if res: 
    res = function3() 

这可能被认为更具可读性,但它确实浪费了大量的垂直空间。尽管如此,至少你并不是在嵌套if

4

我可能会使用partial,使零参数的功能,你可以遍历(而不是某种结构与功能及其参数),而不是把它变成

functions = [ 
    functools.partial(func1, arg1a, arg1b), 
    functools.partial(func2), 
    functools.partial(func3, keyword_a=kwarg3a, keyword_b=kwarg3b) 
] 

然后一个list并遍历它,你可以叫all

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),或运行所有功能并返回True,如果它们全都返回True(或任何其他值为真的)。由于文档说,它等同于:

def all(iterable): 
    for element in iterable: 
     if not element: 
      return False 
    return True 

这是值得的partial小号比较的tuple S IN对方的回答,其作为伪谐音,无论是在他们是如何定义和他们是如何”重新叫:

f1 = functools.partial(func, arg1, arg2, kw1=kwarg1, kw2=kwarg2) 
f2 = (func1, (arg1a, arg1b), {'kw1': kwarg1, 'kw2': kwarg2 }) 

f1() 
f2[0](*f2[1], **f2[2]) 

很明显,你可以(而且应该作为aemdy的答案一样)拨打电话与元组拆包更具可读性,但它仍然永远不会像使用真实部分一样简单。

+0

Python社区往往害怕'functools',但对我的钱来说,这是最具可读性的。 – Cairnarvon 2013-02-26 20:28:11

+0

@Cairnarvon:也许Python 2.x社区或从10年前的书中学到的人害怕functools,但实际的Python开发人员在整个地方都使用“partial”。例如,Guido的“郁金香”例子充满了它。用它代替存储在'tuple's中的'lambda'函数或伪部分就是它的存在。 – abarnert 2013-02-26 20:30:13

+0

+1与元组方法进行比较。如果人们仍然害怕'functools',这个例子很明显,他们不应该。 – rainer 2013-03-01 08:58:50

1

没有必要弄得太复杂:

res = function1() 
res = res and function2() 
res = res and function3() 
... 

这看起来有点奇怪,但会做你想要什么,而不必左右扭动函数调用自己变成字典什么的清单。这只是一个写Cairnarvon的回答更长的路:

res = (
    function1() and 
    function2() and 
    function3() and 
    ... 
    ) 
相关问题