来自Pylint的Cell-var-from-loop警告


91

对于以下代码:

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源代码,描述为:

闭包中使用的变量在循环中定义。这将导致所有闭包对封闭变量使用相同的值。

但是我不知道这意味着什么。谁能举例说明这个问题?


什么样的物体是results?普通名单?还有吗
凯文


@Kevin例如,结果= [{{key:value},{key:value} ...]
xis

好。在这种情况下,我同意chepner的意见,您不必担心这里的警告。
凯文(Kevin)

Answers:


101

名称sort_key中的身体lambda会抬头时,函数实际上是所谓的,所以它会看到的价值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))

5
我会更侧重于解决问题,而不是忽略警告。如果可能的话,我将使用key=partial(get_from_dot_path, foo=sort_key)lambda表达式代替(假设您foo定义了一些参数名称get_from_dot_path,可以将其用作关键字参数;partial仅允许从左开始完全填充位置参数)。
chepner

1
啊,我没想到会解决这个问题,我以为它们是等效的。在那种情况下,我同意。
timdiels

3
请注意,当前该技巧并不总是有效github.com/PyCQA/pylint/issues/3107
Daniel Pinyol
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.