我已经定义了一个类,它将[fname1,[parameters1],fname2,[parameters2],...]形式的列表作为创建实例的参数。
这个想法是让实例立即执行列表中的所有函数,并将它们各自的参数传递给它们 - 这样可以正常工作,但我提出的实现非常难看。 它看起来像这样:
# (The input list is split up and transformed into two lists -
# one containing the function names as strings, the other one containing tuples)
# (It then runs a for-loop containing the following statement)
exec '%s%s'%(fname[i],repr(parameter_tuple[i]))
输出并运行'fname(参数,more_parameters,等等),就像它应该做的那样。
我不知道为什么,但是因为我编写了这个,所以我认为我应该得到一个非常好的殴打...虽然它有效,但我知道有必要是一个不那么难看的实现。 有谁愿意帮我看看吗?或者也许是为了打败我? ; - )
答案 0 :(得分:4)
这里最简单的答案,如果你能做到的话,就是简单地传递函数而不是函数名,然后做一个简单的事情:
for function, params in zip(functions, parameters):
function(*params)
请注意我使用zip()
一次循环遍历两个列表。这是比循环索引更多的Pythonic选项。
或者,使用itertools.starmap()
。
如果你真的无法直接传递这些功能,那就变得更加困难了。首先,依赖于变量名称的任何解决方案都本质上是脆弱的,因此最好的选择是创建一个从函数名到函数的显式字典,然后查找函数。
否则,我建议使用inspect
模块来查找所需的功能。 E.g:
import inspect
import sys
def some_function():
...
print(dict(inspect.getmembers(sys.modules[__name__], inspect.isfunction)))
产地:
{'some_function': <function some_function at 0x7faec13005a0>}
但是,请注意,效率低得多且更迂回。最好的答案仍然是传递功能本身。
答案 1 :(得分:0)
这是一个函数,它接受函数列表(不是函数名)和参数列表(或元组)列表:
def callmany(funs, funargs):
return [f(*args) for (f,args) in zip(funs, funargs)]
它返回一个结果列表,其中结果中的第一个元素是在funngs中使用第一个参数列表调用第一个函数的结果。像这样:
callmany([len, range], [["hello"], [1, 10]])
>> [5, [1, 2, 3, 4, 5, 6, 7, 8, 9]]