Cảnh báo cell-var-from-loop từ Pylint


91

Đối với mã sau:

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

Pylint đã báo lỗi:

Khóa sắp xếp biến ô được xác định trong vòng lặp (cell-var-from-loop)

Bất cứ ai có thể cho một gợi ý những gì đang xảy ra ở đây? Từ mã nguồn pylint, mô tả là:

Một biến được sử dụng trong một bao đóng được định nghĩa trong một vòng lặp. Điều này sẽ dẫn đến việc tất cả các lần đóng đều sử dụng cùng một giá trị cho biến đóng qua.

Nhưng tôi không biết nó có nghĩa là gì. Bất cứ ai có thể cho một ví dụ về vấn đề?


Đối tượng là resultsgì? Danh sách bình thường? Thứ gì khác?
Kevin


@Kevin ví dụ: results = [{key: value}, {key: value} ...]
xis

Đồng ý. Trong trường hợp đó, tôi đồng ý với chepner rằng bạn không cần phải lo lắng về cảnh báo ở đây.
Kevin

Câu trả lời:


102

Tên sort_keytrong phần thân của di lambdachúc sẽ được tra cứu khi hàm thực sự được gọi, vì vậy nó sẽ thấy giá trị sort_keycó gần đây nhất. Vì bạn đang gọi sortngay lập tức, giá trị của sort_keysẽ không thay đổi trước khi đối tượng hàm kết quả được sử dụng, vì vậy bạn có thể bỏ qua cảnh báo một cách an toàn. Để tắt tiếng nó, bạn có thể đặt sort_keygiá trị mặc định của một tham số thành lambda:

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

5
Tôi đã cố gắng khắc phục sự cố thay vì bỏ qua cảnh báo. Nếu có thể, tôi sẽ sử dụng key=partial(get_from_dot_path, foo=sort_key)thay cho biểu thức lambda (giả sử có một số tên tham số foođược xác định bởi get_from_dot_pathbạn có thể sử dụng cho đối số từ khóa; partialchỉ cho phép điền các tham số vị trí độc quyền từ bên trái).
chepner 13/1218

1
Ah, tôi không nhận ra điều này sẽ sửa được nó, tôi nghĩ chúng tương đương nhau; trong trường hợp đó tôi đồng ý.
timdiels

3
lưu ý rằng hiện lừa không phải lúc nào việc github.com/PyCQA/pylint/issues/3107
Daniel Pinyol
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.