【问题标题】:Dynamic functions in python [duplicate]python中的动态函数[重复]
【发布时间】:2012-11-05 02:05:48
【问题描述】:

可能重复:
Local variables in Python nested functions

这是我的问题,我需要在 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

谢谢

【问题讨论】:

  • 了解 python 中的后期绑定。
  • 我不完全确定你试图完成什么。但是使用类不是更好吗?

标签: python


【解决方案1】:

为此使用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"]]。当您的函数变得复杂时,这可能是个好主意。

【讨论】:

  • 感谢您的帮助,我认为可调用类是解决我的问题的最干净的解决方案。我不能使用 functool 因为我的 print_func 不能有参数。
【解决方案2】:

您可以使用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'

【讨论】:

    【解决方案3】:

    我只是稍微修改了你的代码:

    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
    

    【讨论】:

    • 感谢您的回复,这正是我所需要的,但来自 larsmans 的可调用类可能更简洁一些。
    【解决方案4】:
    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()
    

    【讨论】:

      猜你喜欢
      • 2015-09-01
      • 1970-01-01
      • 2016-11-21
      • 2014-05-17
      • 2015-12-16
      • 1970-01-01
      • 2012-10-23
      • 2012-01-28
      • 2020-12-04
      相关资源
      最近更新 更多