web-dev-qa-db-ja.com

PylintからのCell-var-from-loop警告

次のコードの場合:

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ソースコードからの説明は次のとおりです。

クロージャーで使用される変数は、ループで定義されます。これにより、closed-over変数に同じ値を使用するすべてのクロージャーが生成されます。

しかし、私はそれが何を意味するのか分からない。誰でも問題の例を挙げることができますか?

62
xis

lambdaの本文にあるsort_keyという名前は、関数が実際に呼び出されたときに検索されるため、sort_keyが最後に持っていた値が表示されます。すぐにsortを呼び出すため、sort_keyの値は、結果の関数オブジェクトが使用される前に変更されないため、警告を安全に無視できます。それを黙らせるには、sort_keylambdaへのパラメーターのデフォルト値にすることができます:

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