Peringatan cell-var-from-loop dari Pylint

91

Untuk kode berikut:

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

Pylint melaporkan kesalahan:

Kunci_urutkan variabel sel ditentukan dalam loop (cell-var-from-loop)

Adakah yang bisa memberi petunjuk apa yang terjadi di sini? Dari kode sumber pylint deskripsinya adalah:

Variabel yang digunakan dalam closure didefinisikan dalam sebuah loop. Ini akan menghasilkan semua penutupan menggunakan nilai yang sama untuk variabel tertutup.

Tapi saya tidak tahu apa artinya. Adakah yang bisa memberi contoh masalah?

xis
sumber
Benda apa itu results? Daftar biasa? Sesuatu yang lain?
Kevin
1
Lihat misalnya stackoverflow.com/q/12423614/3001761
jonrsharpe
@Kevin misalnya hasil = [{key: value}, {key: value} ...]
xis
Baik. Dalam hal ini, saya setuju dengan chepner bahwa Anda tidak perlu khawatir tentang peringatan di sini.
Kevin

Jawaban:

102

Nama sort_keydalam isi lambdaakan dicari ketika fungsi tersebut benar-benar dipanggil, sehingga akan melihat nilai yang sort_keypaling baru. Karena Anda memanggil sortsegera, nilai dari sort_keytidak akan berubah sebelum objek fungsi yang dihasilkan digunakan, jadi Anda bisa mengabaikan peringatan tersebut dengan aman. Untuk menonaktifkannya, Anda dapat membuat sort_keynilai default parameter ke lambda:

results.sort(key=lambda k, sk=sort_key: get_from_dot_path(k, sk),
             reverse=(order == -1))
chepner
sumber
5
Saya akan melakukan kesalahan dalam memperbaiki masalah daripada mengabaikan peringatannya. Jika memungkinkan, saya akan menggunakan key=partial(get_from_dot_path, foo=sort_key)alih-alih ekspresi lambda (dengan asumsi ada beberapa nama parameter yang fooditentukan oleh get_from_dot_pathyang dapat Anda gunakan untuk argumen kata kunci; partialhanya memungkinkan pengisian parameter posisi secara eksklusif dari kiri).
chepner
1
Ah saya tidak menyadari ini akan memperbaikinya, saya pikir mereka setara; dalam hal ini saya setuju.
timdiels
3
Ketahuilah bahwa saat ini trik tersebut tidak selalu berhasil github.com/PyCQA/pylint/issues/3107
Daniel Pinyol