Python:将函数名称和参数列表传递给类实例

时间:2012-09-22 10:57:07

标签: python

我已经定义了一个类,它将[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,等等),就像它应该做的那样。

我不知道为什么,但是因为我编写了这个,所以我认为我应该得到一个非常好的殴打...虽然它有效,但我知道有必要是一个不那么难看的实现。 有谁愿意帮我看看吗?或者也许是为了打败我? ; - )

2 个答案:

答案 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]]