我尝试执行一系列函数,其中一些函数的输出被用作其他函数的输入。
我尝试做的简单示例:
def a():
return 25
def b():
return 50
def c(x, y):
return x+y
通常,我会:print c(a(), b())
但如果我有一个功能列表:l = [a,b,c]
如何迭代此列表并获取传递给方法c的正确参数?
感谢。
答案 0 :(得分:2)
我以前的答案不够通用,所以这里是另一个bash。这使用inspect.getargspec()
在调用它之前确定每个函数的arity。有了这些知识,所需的参数数量可以从“结果列表”中切出,其中包含所有先前函数调用的结果。
有一些限制:
inspect.getargspec()
不适用于内置函数,只适用于用户定义的函数。代码:
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] ] )