让lambda在循环中生成唯一数据
Getting lambda to generate unique data in a loop
我正在为 Blender 开发一个附加组件,我正在尝试通过 "update" 属性将自定义更新函数分配给属性列表。 update 函数将只接受 2 个参数(self 和 context,或者 s 和 c)。但我想发送第三个参数来标识正在更新的 属性。这个参数是一个索引。这就是我的开头:
for i in range(0,len(props)):
props[i].update = lambda s, c: CustomUpdate( s, c, i )
但我很快意识到,lambda 记录的是正在使用的变量,而不是该变量的值。所以所有 属性 更新函数最终都是这样生成的:
for i in range(0,len(props)):
props[i].update = CustomUpdate( s, c, len(props) - 1 )
我寻找答案并找到了这个解决方案:
for i in range(0,len(props)):
props[i].update = lambda s, c, index=i: CustomUpdate( s, c, index )
但是,Blender 似乎会仔细检查此处提供的函数的参数数量,并在使用超过 2 个时抛出错误,因此我无法使用第三个 lambda 参数。
所以我目前正在尝试弄清楚如何说服 lambda 为回调的每个 属性 生成唯一索引。可能有一些方法可以在分配后编辑 lambda?或者在某些代码中包装 i
以在解析期间而不是在执行期间强制评估的任何技巧?
编辑:忘了说我的道具列表是静态的。因此,如果可能的话,循环索引计数器可以由解析器展开。
每个 lambda 都需要自己的上下文来保存它的 i 值:
def makeLambda(i):
return lambda s,c: CustomUpdate( s, c, i )
for i in range(0,len(props)):
prop[i].update = makeLambda(i)
我正在为 Blender 开发一个附加组件,我正在尝试通过 "update" 属性将自定义更新函数分配给属性列表。 update 函数将只接受 2 个参数(self 和 context,或者 s 和 c)。但我想发送第三个参数来标识正在更新的 属性。这个参数是一个索引。这就是我的开头:
for i in range(0,len(props)):
props[i].update = lambda s, c: CustomUpdate( s, c, i )
但我很快意识到,lambda 记录的是正在使用的变量,而不是该变量的值。所以所有 属性 更新函数最终都是这样生成的:
for i in range(0,len(props)):
props[i].update = CustomUpdate( s, c, len(props) - 1 )
我寻找答案并找到了这个解决方案:
for i in range(0,len(props)):
props[i].update = lambda s, c, index=i: CustomUpdate( s, c, index )
但是,Blender 似乎会仔细检查此处提供的函数的参数数量,并在使用超过 2 个时抛出错误,因此我无法使用第三个 lambda 参数。
所以我目前正在尝试弄清楚如何说服 lambda 为回调的每个 属性 生成唯一索引。可能有一些方法可以在分配后编辑 lambda?或者在某些代码中包装 i
以在解析期间而不是在执行期间强制评估的任何技巧?
编辑:忘了说我的道具列表是静态的。因此,如果可能的话,循环索引计数器可以由解析器展开。
每个 lambda 都需要自己的上下文来保存它的 i 值:
def makeLambda(i):
return lambda s,c: CustomUpdate( s, c, i )
for i in range(0,len(props)):
prop[i].update = makeLambda(i)