Para o seguinte código:
for sort_key, order in query_data['sort']:
results.sort(key=lambda k: get_from_dot_path(k, sort_key),
reverse=(order == -1))
Pylint relatou um erro:
Variável de célula sort_key definida em loop (cell-var-from-loop)
Alguém poderia dar uma dica do que está acontecendo aqui? A descrição do código-fonte do pylint é:
Uma variável usada em um encerramento é definida em um loop. Isso resultará em todos os fechamentos usando o mesmo valor para a variável fechada.
Mas eu não tenho ideia do que isso significa. Alguém poderia dar um exemplo do problema?
results
? Lista comum? Algo mais?Respostas:
O nome
sort_key
no corpo dolambda
será pesquisado quando a função for realmente chamada, para que ele veja o valorsort_key
mais recente. Como você está chamandosort
imediatamente, o valor desort_key
não será alterado antes que o objeto de função resultante seja usado, portanto, você pode ignorar o aviso com segurança. Para silenciá-lo, você pode definirsort_key
o valor padrão de um parâmetro paralambda
:results.sort(key=lambda k, sk=sort_key: get_from_dot_path(k, sk), reverse=(order == -1))
fonte
key=partial(get_from_dot_path, foo=sort_key)
vez da expressão lambda (supondo que haja algum nome de parâmetrofoo
definido porget_from_dot_path
que você possa usar como um argumento de palavra-chave;partial
permite apenas preencher parâmetros posicionais exclusivamente da esquerda).