Почему pylint возражает против имен односимвольных переменных?


Я все еще привыкаю к соглашениям python и использую pylint чтобы сделать мой код более подходящие для Python, но я озадачен тем, что 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, или это стандарт, который уникален для pylint?

5 62

5 ответов:

PyLint проверяет не только рекомендации PEP8. Он также имеет свои собственные рекомендации, одна из которых заключается в том, что имя переменной должно быть описательным и не слишком коротким.

вы можете использовать это, чтобы избежать таких коротких имен:

my_list.extend(x_values)

или настройки PyLint по конфигурация чтобы сказать PyLint, какое имя переменной хорошо.

немного подробнее о том, что отметил Гурни Алекс: вы можете сказать PyLint, чтобы сделать исключения для имена переменных которые (вы мизинец ругаться) совершенно ясно, хотя менее трех символов. Найти или добавить в свой pylintrc, под :

# 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-имена переменных, которые я добавил.

более глубокая причина заключается в том, что вы можете вспомнить, что вы хотели a,b,c,x,y и z чтобы иметь в виду, когда вы написали свой код, но когда другие читают его, или даже когда вы возвращаетесь к своему коду, код становится гораздо более читаемым, когда вы даете ему семантическое имя. Мы не будем писать что-то на доске, а потом стирать. Мы пишем код, который может оставаться в течение десятилетия или более, и читаться много, много раз.

использовать семантические имена. Семантические имена, которые я использовал, были похожи ratio,denominator,obj_generator,path и т. д. Это может занять дополнительную секунду или две, чтобы напечатать их, но время, которое вы сэкономите, пытаясь выяснить, что вы написали даже через полчаса, того стоит.

в строго типизированных языках переменные имени 1 буквы могут быть ok-ish, потому что вы обычно получаете тип рядом с именем в объявлении переменной или в прототипе функции / метода:

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)

и вы даже добавляете строку документа, объясняющую, что делает материал и какие типы ожидаются.

В настоящее время существует также возможность переопределить выражение. Т. е. если вы хотите разрешить одиночные символы в качестве переменных:

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

и pylint будет соответствовать PEP8 и не принесет дополнительных нарушений сверху. Также вы можете добавить его в .pylintrc.