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?
results
? Daftar biasa? Sesuatu yang lain?Jawaban:
Nama
sort_key
dalam isilambda
akan dicari ketika fungsi tersebut benar-benar dipanggil, sehingga akan melihat nilai yangsort_key
paling baru. Karena Anda memanggilsort
segera, nilai darisort_key
tidak akan berubah sebelum objek fungsi yang dihasilkan digunakan, jadi Anda bisa mengabaikan peringatan tersebut dengan aman. Untuk menonaktifkannya, Anda dapat membuatsort_key
nilai default parameter kelambda
:results.sort(key=lambda k, sk=sort_key: get_from_dot_path(k, sk), reverse=(order == -1))
sumber
key=partial(get_from_dot_path, foo=sort_key)
alih-alih ekspresi lambda (dengan asumsi ada beberapa nama parameter yangfoo
ditentukan olehget_from_dot_path
yang dapat Anda gunakan untuk argumen kata kunci;partial
hanya memungkinkan pengisian parameter posisi secara eksklusif dari kiri).