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

问题描述 投票:1回答:1

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

例如:

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

调用任何生成的lambdas返回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.')

当最终的print语句执行时,它会获取idx当前在全局范围内的值。使用适当的睡眠语句,所有3个线程都将打印'thread_2 complete.'

python python-3.x python-multithreading python-decorators
1个回答
0
投票

你可以使用functools.partial,第一个问题可以解决,

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

它会给你想要的结果。但是,我无法理解第二个用例。

© www.soinside.com 2019 - 2024. All rights reserved.