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

xis*_*xis 71 python lambda closures

对于以下代码:

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

Pylint报告错误:

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

任何人都可以暗示这里发生了什么吗?从pylint源代码描述是:

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

但我不知道这意味着什么.谁能举一个这个问题的例子?

che*_*ner 80

当函数被实际调用时,将查找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))
Run Code Online (Sandbox Code Playgroud)

  • 您也可以使用#pylint禁止显示警告:disable = cell-var-from-loop` (3认同)
  • 我更愿意修正问题,而不是忽略警告。如果可能的话,我会使用`key = partial(get_from_dot_path,foo = sort_key)`而不是lambda表达式(假设有一个`get_from_dot_path`定义的参数名`foo`可用于关键字参数;`partial `仅允许仅从左侧填充位置参数)。 (3认同)
  • 请注意,目前该技巧并不总是有效 https://github.com/PyCQA/pylint/issues/3107 (3认同)

mjo*_*ngr 13

使用functools.partial()

import functools
results.sort(key=functools.partial(get_from_dot_path, foo=sort_key),
             reverse=(order == -1))
Run Code Online (Sandbox Code Playgroud)