定义时的Python解引用关闭变量

时间:2019-04-04 14:27:34

标签: python python-3.x python-multithreading python-decorators

this post中的答案很好地详细说明了python内部函数如何在内部函数实际执行之前不使用闭包变量的值,并在适当的范围内找到变量名称。

例如:

funcs = [(lambda: x) for x in range(3)]

调用任何生成的lambda都会返回2:

>>> funcs[0]()
2
>>> funcs[1]()
2
>>> funcs[2]()
2

有没有一种方法可以在定义函数时而不是在以后执行时强制确定x的值?在上面的示例中,我想要的输出是0、1、2分别。

更具体地说,我的用例是为API用户提供一种使用装饰器方便地将自定义函数转换为线程的方法。例如:

for idx in range(3):
    @thread_this(name=f'thread_{idx}')
    def custom():
        do_something()
        print(f'thread_{idx} complete.')

执行最后的打印语句时,它将拾取全局范围内idx current 值。使用适当的sleep语句,所有3个线程将打印'thread_2 complete.'

1 个答案:

答案 0 :(得分:0)

您可以使用functools.partial,第一个问题可以通过解决,

funcs = [functools.partial(lambda x: x, x) for x in xrange(3)]

它将给您想要的结果。 但是,我不明白第二个用例。