可能重复:
使用自定义名称创建 Python 动态函数
我写了一个小脚本来确定我想做的事情是否可行。这是。
我的目标是动态地(在运行时)创建函数(或方法),其名称基于任意大小的列表(列表大小 = 动态创建的函数数)。所有的函数都做同样的事情(现在),它们只是打印它们的参数。
下面的代码正是我想要的,但是,它不干净而且非常蛮力。我试图弄清楚是否有更好的方法来做到这一点。
class Binder:
def __init__(self, test_cases):
""""
test_cases: a list of function/method names.
length of test_case = number of methods created.
"""
for test_case in test_cases:
#construct a code string for creating a new method using "exec"
func_str = "def "
func_str += test_case
func_str += "(*args):"
func_str += "\n\t"
func_str += "for arg in args:"
func_str += "\n\t\t"
func_str += "print arg"
func_str += "\n"
"""
For example, func_str for test_cases[0]= "func1" is simply:
def func1(*args):
for arg in args:
print arg
"""
#use exec to define the function
exec(func_str)
#add the function as a method to this class
# for test_cases[0] = "func1", this is: self.func1 = func1
set_self = "self." + test_case + " = " + test_case
exec(set_self)
if __name__ == '__main__':
#this list holds the names of the new functions to be created
test_cases = ["func1", "func2", "func3", "func4"]
b = Binder(test_cases)
#simply call each function as the instant's attributes
b.func1(1)
b.func2(1, 3, 5)
b.func4(10)
输出是:
1
1
3
5
10
正如预期的那样。
更新函数的内容不仅仅是一个打印参数的for循环,它会做一些更有意义的事情。我从上面的代码中得到了我想要的确切结果,只是想知道是否有更好的方法。
更新我正在绑定一个更大模块的两端。一端确定测试用例是什么,除此之外,填充测试用例名称的列表。另一端是函数本身,它必须与测试用例名称进行 1:1 映射。所以我有了测试用例的名称,我知道我想对每个测试用例做什么,我只需要创建具有测试用例名称的函数。由于测试用例的名称是在运行时确定的,因此基于这些测试用例的函数创建也必须在运行时进行。测试用例的数量也是在运行时确定的。
有一个更好的方法吗??欢迎任何和所有建议。
提前致谢。
马赫迪