2016-08-22 75 views
0

我有4个函数。我希望我的代码执行第一个,第二个,第三个或第四个。除非他们全都失败,否则我至少也要一个(他们中的任何一个)。 我最初的实施是:调用函数或函数(python)

try: 
    function1(var) 
except: 
    pass 
try: 
    function2(var) or function3(var) or function4(var) 
except: 
    pass 

如果函数2不起作用,它不会去功能3,怎么可能这个编码考虑是什么?

回答

2

如果确定函数失败的成功与否,是否引发异常,您可以编写一个助手方法,它会尝试调用函数列表,直到成功函数返回。

#!/usr/bin/env python 
# coding: utf-8 

import sys 

def callany(*funs): 
    """ 
    Returns the return value of the first successfully called function 
    otherwise raises an error. 
    """ 
    for fun in funs: 
     try: 
      return fun() 
     except Exception as err: 
      print('call to %s failed' % (fun.__name__), file=sys.stderr) 
    raise RuntimeError('none of the functions could be called') 

if __name__ == '__main__': 
    def a(): raise NotImplementedError('a') 
    def b(): raise NotImplementedError('b') 
    # def c(): raise NotImplementedError('c') 
    c = lambda: "OK" 

    x = callany(a, b, c) 
    print(x) 
    # call to a failed 
    # call to b failed 
    # OK 

上面的玩具实现可以通过添加对函数参数的支持来改进。

可运行的代码片段:https://glot.io/snippets/ehqk3alcfv

如果功能指示返回一个布尔值的成功,你可以使用它们,就像在一个普通的布尔表达式。