Pylint的循环变量警告

128 投票
2 回答
55822 浏览
提问于 2025-04-18 17:19

对于以下代码:

for sort_key, order in query_data['sort']:
    results.sort(key=lambda k: get_from_dot_path(k, sort_key),
                 reverse=(order == -1))

Pylint 报告了一个错误:

在循环中定义的单元变量 sort_key (cell-var-from-loop)

有人能告诉我这是什么意思吗?根据 pylint 的源代码,描述是:

在闭包中使用的变量是在循环中定义的。这将导致所有使用这个闭包的地方都使用同一个值。

但我完全不明白这是什么意思。有人能举个例子说明这个问题吗?

2 个回答

13

使用 functools.partial() 这个功能:

import functools
results.sort(key=functools.partial(get_from_dot_path, foo=sort_key),
             reverse=(order == -1))
141

在这个例子中,lambda里的sort_key名字会在函数真正被调用的时候去查找,所以它会看到sort_key最近的值。因为你是立刻调用sort,所以在结果函数对象被使用之前,sort_key的值不会改变,因此你可以放心地忽略这个警告。如果你想消除这个警告,可以把sort_key设为lambda一个参数的默认值:

results.sort(key=lambda k, sk=sort_key: get_from_dot_path(k, sk),
             reverse=(order == -1))

撰写回答