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

Python:将函数名和参数列表传递给类实例,python,Python,我定义了一个类,它采用[fname1、[parameters1]、fname2、[parameters2]、…]形式的列表作为创建实例的参数 这个想法是让实例一次执行列表中的所有函数,并向它们传递各自的参数——这一切都很好,但我提出的实现非常糟糕。 它看起来像这样: # (The input list is split up and transformed into two lists - # one containing the function names as strings, the o

我定义了一个类,它采用[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(参数、更多参数等等)”,就像它应该做的那样

我不知道为什么,但自从我把它编码后,我就有了这样一个想法:我应该为此受到一次真正的痛打。。。虽然它可以工作,但我只知道必须有一个不那么难看的实现。
有人愿意帮我看吗?或者是打我一顿?;-)

如果可以,这里最简单的答案是只传递函数而不是函数名,然后执行一个简单的操作:

对于函数,zip中的参数(函数、参数):
函数(*params)
请注意,我使用
zip()
一次循环两个列表。这是比在索引上循环更具python风格的选项

或者,也可以使用

如果确实无法直接传递函数,那么就变得更加困难。首先,任何依赖于变量名的解决方案都是天生脆弱的,因此最好的选择是创建一个从函数名到函数的显式字典,然后查找函数

否则,我建议使用该模块来查找所需的函数。例如:

import inspect
import sys

def some_function():
       ...

print(dict(inspect.getmembers(sys.modules[__name__], inspect.isfunction)))
产生:

{'some_function': <function some_function at 0x7faec13005a0>}
{'some_function':}

然而,请注意,这样做效率低得多,而且更迂回。最好的答案仍然是传递函数本身。

如果可以的话,这里最简单的答案是传递函数而不是函数名,然后执行一个简单的操作:

对于函数,zip中的参数(函数、参数):
函数(*params)
请注意,我使用
zip()
一次循环两个列表。这是比在索引上循环更具python风格的选项

或者,也可以使用

如果确实无法直接传递函数,那么就变得更加困难。首先,任何依赖于变量名的解决方案都是天生脆弱的,因此最好的选择是创建一个从函数名到函数的显式字典,然后查找函数

否则,我建议使用该模块来查找所需的函数。例如:

import inspect
import sys

def some_function():
       ...

print(dict(inspect.getmembers(sys.modules[__name__], inspect.isfunction)))
产生:

{'some_function': <function some_function at 0x7faec13005a0>}
{'some_function':}

然而,请注意,这样做效率低得多,而且更迂回。最好的答案仍然是传递函数本身。

这里有一个函数,它接受函数列表(不是函数名)和参数列表(或元组)列表:

它返回一个结果列表,其中结果中的第一个元素是使用funargs中的第一个参数列表调用funs中的第一个函数的结果。像这样:

callmany([len, range], [["hello"], [1, 10]])
>> [5, [1, 2, 3, 4, 5, 6, 7, 8, 9]]

下面是一个函数,它接受函数列表(不是函数名)和参数列表(或元组)列表:

它返回一个结果列表,其中结果中的第一个元素是使用funargs中的第一个参数列表调用funs中的第一个函数的结果。像这样:

callmany([len, range], [["hello"], [1, 10]])
>> [5, [1, 2, 3, 4, 5, 6, 7, 8, 9]]

很不错的!我还不知道zip函数。非常感谢分享。:)很不错的!我还不知道zip函数。非常感谢分享。:)这已在标准库中。看见没有必要重新实现它(以一种效率较低的方式)。这已经在标准库中了。看见没有必要(以效率较低的方式)重新实现它。