pylint가 단일 문자 변수 이름에 반대하는 이유는 무엇입니까?


96

나는 여전히 파이썬 규칙에 익숙해지고 pylint내 코드를 더 파이썬 적으로 만들기 위해 사용 하고 있지만, pylint가 단일 문자 변수 이름을 좋아하지 않는다는 사실에 의아해합니다. 다음과 같은 몇 가지 루프가 있습니다.

for x in x_values:
   my_list.append(x)

내가 실행할 때 pylint, 나는군요 Invalid name "x" for type variable (should match [a-z_][a-z0-9_]{2,30}유효한 변수 이름은 3 ~ 31 자 사이 여야 제안,하지만 나는이를 통해 검토 한 - PEP8 명명 규칙 과 나는 하나의 소문자에 대한 명시 적 아무것도 표시되지 않습니다 , 그리고 나는 그것들을 사용하는 많은 예를 봅니다.

PEP8에서 빠진 것이 있습니까? 아니면 이것이 파일 린트 고유의 표준입니까?

답변:


47

PyLint는 PEP8 권장 사항뿐만 아니라 확인합니다. 또한 자체 권장 사항이 있는데, 그중 하나는 변수 이름이 너무 짧아서는 안되고 설명 적이어야한다는 것입니다.

이를 사용하여 이러한 짧은 이름을 피할 수 있습니다.

my_list.extend(x_values)

또는 PyLint의 구성 을 조정 하여 어떤 변수 이름이 좋은지 PyLint에 알립니다.


10
_임시 값을 유지하는 데 사용 하는 것은 반 패턴입니다. 변수는 다음과 같은 관련성이없는 / 폐기 값이 아니라 일시적인 할당, 표시 밑줄 i또는 x. 또한 인터프리터에서 마지막 표현식의 마지막 값을 유지하는 것은 특별한 의미가 있습니다.
James

122

gurney alex가 지적한 내용에 대해 좀 더 자세히 설명합니다. PyLint에게 변수 이름에 대한 예외를 만들도록 지시 할 수 있습니다.이 변수 이름 은 3 자 미만 임에도 완벽하게 명확합니다. 헤더 아래에서 pylintrc 파일 을 찾거나 추가합니다 [FORMAT].

# Good variable names which should always be accepted, separated by a comma
good-names=i,j,k,ex,Run,_,pk,x,y

여기서 pk (기본 키용), x 및 y는 내가 추가 한 변수 이름입니다.


7
이것이 최고의 답변입니다.
giorgiosironi

1
에서 작동하지 않는 것 같습니다 pylint 1.8.3. pylint.pycqa.org/en/1.8/user_guide/options.html
James


2
내가 정말로 원하는 것은 이해에 사용될 때 pylint가 (요청시) 짧은 vars를 받아들이도록하는 것입니다. 비교 return [customer_address for customer_address in thing.get_customer_addresses() if customer_address.is_proper()]return [a for a in thing.get_customer_addresses() if a.is_proper()] I 주장은 문맥에서 명백하기 때문에 후자가 더 명확합니다. 일반적으로 가변 길이는 변수의 범위와 연관되어야합니다.
EdvardM

22

강력한 형식의 언어에서는 일반적으로 변수 선언 또는 함수 / 메서드 프로토 타입에서 이름 옆에 형식을 가져 오므로 1 자 이름 변수는 괜찮을 수 있습니다.

bool check_modality(string a, Mode b, OptionList c) {
    ModalityChecker v = build_checker(a, b);
    return v.check_option(c);
}

Python에서는이 정보를 얻지 못하므로 다음과 같이 작성하면됩니다.

def check_modality(a, b, c):
    v = build_checker(a, b)
    return v.check_option(c)

함수가 수행 할 수있는 작업, 호출 방법 및 반환되는 내용에 대해 유지 관리 팀에 전혀 단서가 없습니다. 따라서 Python에서는 설명적인 이름을 사용하는 경향이 있습니다.

def check_modality(name, mode, option_list):
    checker = build_checker(name, mode)
    return checker.check_option(option_list)

그리고 당신은 물건이하는 일과 예상되는 유형을 설명하는 독 스트링을 추가합니다.


7
"컴파일 된 언어"대신 "명시 적으로 입력 된"이라고 썼습니다. 예를 들어 Haskell도 컴파일되지만 Python과 같이 암시 적 선언을 작성할 수 있습니다.
Sebastian Mach

14
이 경우에 동의하지만 변수 이름에 3 자 이상을 강제 적용한다고해서 설명이 포함된다는 의미는 아닙니다. with open(FILE) as f: items = f.readlines()예를 들어 현재 변수 f가 정말 분명한 곳을 사용 하고 있지만 필 린트 경고가 표시됩니다. 이것은 나를 flake8로 변경했습니다.
Axel Örn Sigurðsson 2014-08-20

3
변수 이름에 'f'를 허용하도록 파일 린트 규칙을 변경할 수도 있습니다. 이미 i, j AFAIR에 대한 예외가 있습니다.
gurney alex

10
이 대답을 반대하는 사람들을 위해 : 나는 Pylint에서 규칙을 도입 한 사람이고 그 이유는 정확히 주어진 것입니다. 이 결정에 동의하지 않을 수 있습니다,하지만이 ... 그럼에도 불구하고 질문에 대한 답이다
들것 알렉스

1
나는 당신의 추론을 전적으로 따르지만 알고리즘과 수학적 프로그래밍에서 종종 일부 값은 일반적으로 한 글자로 명명됩니다. 호출 된 함수 fOptionList호출 된 c와 완전히 다른 것 같습니다 . 특히 function내장 그림자 때문에 이름을 바꿀 수 없을 때 .
kap

19

요즘에는 regexp를 재정의하는 옵션도 있습니다. 즉, 단일 문자를 변수로 허용하려는 경우 :

pylint --variable-rgx="[a-z0-9_]{1,30}$" <filename>

따라서 pylintPEP8과 일치하고 추가 위반 사항이 발생하지 않습니다. 또한에 추가 할 수 있습니다 .pylintrc.


3
버전의 경우 > 1.8.3이것이 답인 것 같습니다. .pylintrc영구 구성을 위해 이것을 넣을 수 있습니다 : variable-rgx=[a-z0-9_]{1,30}$.
James

7
--variable-rgx = "[a-z _] [a-z0-9 _] {0,30} $"가 좀 더 적절할 수 있습니다. "9"는 유효한 변수 이름이 아니어야합니다.
Eric Le Fort

16

깊은 이유는 당신이 의도를 기억할 수 있다는 것이다 a, b, c, x, y, 그리고 z당신은 당신의 코드를 쓸 때 의미하지만, 다른 사람들이 그것을 읽을 때, 또는 당신은 당신의 코드에 돌아올 경우에도 코드가 당신이 줄 때 훨씬 더 읽기된다 의미 론적 이름입니다. 우리는 칠판에 한 번만 적었다가 지우는 것이 아닙니다. 우리는 10 년 이상 지속되고 여러 번 읽을 수있는 코드를 작성하고 있습니다.

의미 론적 이름을 사용하십시오. 내가 사용했던 시맨틱 이름이 같았 ratio, denominator, obj_generator, path, 등 그것은 그들을 입력 여분의 두 번째 또는 두 걸릴 수 있지만, 시간은 당신이 그때부터도 반 시간 쓴 알아 내려고 저장 잘 가치가있다 .


7
감사. 최종 코드는 다음과 같습니다. gist.github.com/amandabee/8969833- 제가 (또는 여러분) 1 년 안에 읽을 수있는 코드에 대한 귀하의 요점을 보았지만이 경우 x와 y는 진정으로 설명 적이라고 생각합니다.
Amanda

OTOH XML 문서에서 <dt /> 요소를 추출하는 경우 변수 'dt'에 저장하는 것이 매우 명확 해 보이지만 'date'(이 요소가 나타내는 것)로 저장하면 혼란 스러울 수 있습니다. 그리고 'the_dt_field'와 같은 것을 만드는 것은 단지 어리석은 로고 레입니다. (아니요, 요소 이름을 제어 할 수 없습니다. 다른 사람의 스키마입니다.) 규칙을 테스트하는 예외가 많이 있어야합니다.
Mark Wood
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.