这是我的问题,我需要在python中动态创建函数。我在参数中有一个列表,我需要为这个列表的每个元素创建一个函数。
以下是一个例子:
list_func = []
list_param = ['foo','bar']
for param in list_param:
def print_func():
print(param)
list_func += [print_func]
for func in list_func:
func()
使用此代码,第二个循环将只打印最后一个参数。 这是输出:
bar
bar
我需要
foo
bar
由于
答案 0 :(得分:2)
请使用functools.partial
。
>>> import functools
>>> def print_func(param):
... print(param)
...
>>> list_func = [functools.partial(print_func, x) for x in ["foo", "bar"]]
>>> list_func[0]()
foo
>>> list_func[1]()
bar
或者,您可以定义可调用类:
class Printer(object):
def __init__(self, param):
self.param = param
def __call__(self):
print(self.param)
然后list_func = [Printer(x) for x in ["foo", "bar"]]
。当函数变得复杂时,这可能是一个好主意。
答案 1 :(得分:1)
您可以使用lambda
:
In [87]: list_func = []
In [88]: list_param = ['foo','bar']
In [89]: for param in list_param:
list_func.append(lambda i=param:i)
....:
In [91]: list_func[0]()
Out[91]: 'foo'
In [92]: list_func[1]()
Out[92]: 'bar'
答案 2 :(得分:1)
我刚刚修改了你的代码:
list_func = []
list_param = ['foo','bar']
def make_print_func(param):
def print_func():
print(param)
return print_func
list_func += [make_print_func(param) for param in list_param]
for func in list_func:
func()
现在有一个函数make_print_func
可以生成动态所需的函数。
输出是这样的:
foo
bar
答案 3 :(得分:1)
list_func = []
list_param = ['foo', 'bar']
for param in list_param:
def print_func(arg=param): #Look at this string
print(arg)
list_func.append(print_func)
for func in list_func:
func()