Pylint의 Cell-var-from-loop 경고


91

다음 코드의 경우 :

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

Pylint가 오류를보고했습니다.

루프에 정의 된 셀 변수 sort_key (cell-var-from-loop)

아무도 여기서 무슨 일이 일어나고 있는지 힌트를 줄 수 있습니까? pylint 소스 코드에서 설명은 다음과 같습니다.

클로저에 사용되는 변수는 루프에서 정의됩니다. 이것은 모든 클로저가 closed-over 변수에 대해 동일한 값을 사용하는 결과를 가져옵니다.

그러나 나는 그것이 의미하는 바에 대한 단서가 없습니다. 누구든지 문제의 예를 들어 줄 수 있습니까?


어떤 종류의 물건 results입니까? 일반 목록? 다른 것?
Kevin


@Kevin 예 : 결과 = [{key : value}, {key : value} ...]
xis aug

확인. 이 경우 여기에서 경고에 대해 걱정할 필요가 없다는 chepner에 동의합니다.
Kevin

답변:


102

함수가 실제로 호출 될 때 sort_key의 본문에있는 이름 lambda이 조회되므로 sort_key가장 최근 의 값 이 표시됩니다 . sort즉시 호출하므로 sort_key결과 함수 객체가 사용되기 전에 의 값이 변경되지 않으므로 경고를 무시해도됩니다. 이를 무음으로 설정하려면 sort_key매개 변수의 기본값 을 다음으로 설정할 수 있습니다 lambda.

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

5
나는 경고를 무시하는 대신 문제를 해결하는 편에서 실수 할 것입니다. 가능한 경우 key=partial(get_from_dot_path, foo=sort_key)람다 식 대신 사용 합니다 ( 키워드 인수에 사용할 수 있는 매개 변수 이름이 foo정의되어 있다고 가정 하고 왼쪽에서만 위치 매개 변수를 채울 수 있음). get_from_dot_pathpartial
chepner

1
아, 이것이 고쳐질 줄 몰랐습니다. 동등하다고 생각했습니다. 그 경우 동의합니다.
팀 디엘

3
현재 트릭이 항상 작동하는 것은 아닙니다. github.com/PyCQA/pylint/issues/3107
Daniel Pinyol
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.