python - 让 lambda 在循环中生成唯一数据

标签 python lambda blender

我正在为 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/

相关文章:

c# - 如何提取传递给 Expression<Func<T,bool>> 的属性名称和值?

python - 使用 Blender Python 与纯数据的 TCP 连接

php - 使用 php 解压缩 .blend 文件数据的更简单方法?

python - 如何使用 Python/Pandas 在 Excel 中插入新行(带条件)

python - 在 python 中别名 str.join

Java 使用流和 Lambda 表达式而不是迭代器

python - blender 脚本 : Indices of selected vertices

python - 根据另一个列表中的元素重复一个列表中的元素

python - 我如何找出一个社区有多大,例如一个网络框架。

java - 为 Supplier<? 使用 lambda 时编译失败扩展类型>