Dla następującego kodu:
for sort_key, order in query_data['sort']:
results.sort(key=lambda k: get_from_dot_path(k, sort_key),
reverse=(order == -1))
Pylint zgłosił błąd:
Zmienna komórki sort_key zdefiniowana w pętli (cell-var-from-loop)
Czy ktoś mógłby podpowiedzieć, co się tutaj dzieje? Z kodu źródłowego pylint opis to:
Zmienna używana w zamknięciu jest definiowana w pętli. Spowoduje to, że wszystkie zamknięcia będą używać tej samej wartości zmiennej zamkniętej.
Ale nie mam pojęcia, co to znaczy. Czy ktoś mógłby podać przykład problemu?
results
? Zwykła lista? Coś innego?Odpowiedzi:
Nazwa
sort_key
w treścilambda
zostanie wyszukana, gdy funkcja zostanie faktycznie wywołana, więc zobaczy wartość,sort_key
którą ostatnio miała. Ponieważ wywołujeszsort
natychmiast, wartośćsort_key
nie zmieni się przed użyciem wynikowego obiektu funkcji, więc możesz bezpiecznie zignorować ostrzeżenie. Aby go wyciszyć, możesz ustawićsort_key
domyślną wartość parametru nalambda
:results.sort(key=lambda k, sk=sort_key: get_from_dot_path(k, sk), reverse=(order == -1))
źródło
key=partial(get_from_dot_path, foo=sort_key)
zamiast wyrażenia lambda (zakładając, że jestfoo
zdefiniowana jakaś nazwa parametruget_from_dot_path
, którą możesz użyć jako argumentu słowa kluczowego;partial
pozwala tylko na wypełnianie parametrów pozycyjnych wyłącznie z lewej strony).