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


94

次のコードの場合:

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 eg results = [{key:value}、{key:value} ...]
xis 2014

OK。その場合、ここでの警告について心配する必要はないというチェプナーに同意します。
ケビン

回答:


105

関数が実際に呼び出されたときに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)、ラムダ式の代わりに使用します(キーワード引数に使用できるパラメーター名がfoo定義されget_from_dot_pathていると仮定します。partial位置パラメーターは、左からのみ入力できます)。
chepner 2018

1
ああ、これで修正できるとは思っていませんでした。同等だと思いました。その場合、私は同意します。
timdiels 2018

3
現在トリックは常に動作しないことに注意してgithub.com/PyCQA/pylint/issues/3107
ダニエルPinyol
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.