python - Python 在定义时取消引用闭包变量
问题描述
这篇文章中的答案很好地详细说明了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.')
当最终的 print 语句执行时,它会获取全局范围内的当前值。idx
使用适当的睡眠语句,所有 3 个线程都将打印'thread_2 complete.'
解决方案
您可以使用 functools.partial,第一个问题可以解决,
funcs = [functools.partial(lambda x: x, x) for x in xrange(3)]
它会给你想要的结果。但是,我无法理解第二个用例。
推荐阅读
- haproxy - Haproxy 检查是否只有键存在
- android - 如何将 RTF 转换为 android spannable?
- sql - MS SQL:如何从查找表中为每个外键对选择最近的记录
- javascript - 用 js 添加重复的 html 并评估 thymeleaf 表达式
- javascript - Webpack - AngularJS 应用程序无法在 IE11 上运行
- javascript - For-loop 仅适用于特定值
- session - 根据 ASP .NET MVC 5 中的用户角色显示按钮
- angular - AngularDart 猫头鹰旋转木马
- java - Spring Boot 数据源不去 BeanPostProcessor
- javascript - 当Chrome被无限循环冻结时如何清空Chrome中的缓存?