我正在为 Blender 开发一个附加组件,并且我正在尝试通过“更新”属性将自定义更新函数分配给属性列表。 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
在某些代码中强制在解析期间而不是执行期间求值?
编辑:忘了提及我的 Prop 列表是静态的。因此,如果可能的话,循环索引计数器可以由解析器展开。
最佳答案
每个 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)
关于python - 让 lambda 在循环中生成唯一数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58626029/