在Python中调用具有正确参数的方法列表

时间:2014-07-16 00:27:40

标签: python method-chaining

我尝试执行一系列函数,其中一些函数的输出被用作其他函数的输入。

我尝试做的简单示例:

def a():
    return 25

def b():
    return 50

def c(x, y):
    return x+y

通常,我会:print c(a(), b())

但如果我有一个功能列表:l = [a,b,c]

如何迭代此列表并获取传递给方法c的正确参数?

感谢。

3 个答案:

答案 0 :(得分:2)

我以前的答案不够通用,所以这里是另一个bash。这使用inspect.getargspec()在调用它之前确定每个函数的arity。有了这些知识,所需的参数数量可以从“结果列表”中切出,其中包含所有先前函数调用的结果。

有一些限制:

  • inspect.getargspec()不适用于内置函数,只适用于用户定义的函数。
  • varargs和关键字args被忽略,因为这会导致可能无限的参数,这只会使事情变得复杂。

代码:

import inspect

def a():
    return 25

def b():
    return 50

def c(x, y):
    return x + y

def d(x, y, z):
    return x + y + z

def e(x=100):
    return x * x

def f():
    pass


def execute_function_list(funcs):
    results = []
    for i, fn in enumerate(funcs):
        args_required = len(inspect.getargspec(fn).args)
        if args_required > 0:
            args = results[i-args_required:i]
        else:
            args = ()
        print("calling function %r with args %r" % (fn, args))
        results.append(fn(*args))
        print("after function returned results = %r" % results)
    return results[-1] if len(results) else None

if __name__ == '__main__':
    funcs = [e, a, b, c, d, e]
    print("final result is %r" % execute_function_list(funcs))

答案 1 :(得分:1)

假设使用列表中所有前面函数的结果调用列表中的最后一个函数:

def c(*args):
    "Return the sum of all function arguments"
    return sum(args)

>>> l = [a, b, a, b, b, b, c]
>>> args=(f() for f in l[:-1])
>>> args
<generator object <genexpr> at 0x7fd441aabe60>
>>> l[-1](*args)
250

或在一行中,

>>> l[-1](*(f() for f in l[:-1]))
250

答案 2 :(得分:0)

您可以尝试内置函数apply

apply( l[-1], [ func() for func in l[:-1] ] )