Pylint показывает недопустимое имя переменной в выводе

Я сделал простой скрипт на Python для размещения данных на веб-сайте.

#Imports

url_to_short = sys.argv[1]

post_url = 'https://www.googleapis.com/urlshortener/v1/url'
headers = {'Content-Type': 'application/json'}

data = {'longUrl': url_to_short}
post_data = json.dumps(data)

req = urllib2.Request(post_url, post_data, headers)
resp = urllib2.urlopen(req)

if resp.getcode() == 200:  
    content = json.loads(resp.read())

#Other stuff

Теперь я подумал, давайте проверим мой скрипт на соответствие стандартам кодирования с помощью инструмента pylint.

Мой вывод pylint выглядит следующим образом:

************* Module post
C:  1,0: Missing docstring
C:  6,0: Invalid name "url_to_short" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$)
C:  8,0: Invalid name "post_url" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$)
C:  9,0: Invalid name "headers" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$)

# Other stuff

Теперь мой вопрос: почему pylint показывает имена моих переменных как Invalid name. Является ли такое имя переменной неправильным соглашением о кодировании.

Мой полный вывод pylint.


person RanRag    schedule 30.05.2012    source источник


Ответы (3)


Поскольку ваш код не содержится в классе или функции, ожидается, что эти переменные будут константы и поэтому они должны быть в верхнем регистре.

Вы можете прочитать PEP8 для получения дополнительной информации.

person Christian Witts    schedule 30.05.2012
comment
В частности, часть соглашений об именах PEP8. - person Cédric Julien; 30.05.2012
comment
Итак, всегда ли необходимо, чтобы, если я пишу такие небольшие фрагменты кода, они были внутри класса. - person RanRag; 30.05.2012
comment
Я бы не стал писать это в классе, я бы просто поместил его в определение функции, что также является хорошей практикой для повторного использования кода. - person Christian Witts; 30.05.2012
comment
Pep 8 не запрещает глобальные переменные... Было бы глупо это делать, потому что python часто используется для написания коротких скриптов. Это, очевидно, тот случай, когда pylint накладывает ограничения, которых нет в PEP 8. - person catphive; 19.06.2012
comment
@catphive pylint также не запрещает их, он просто требует, чтобы они следовали соглашению об именах ALL_CAPS. - person Kroltan; 11.12.2014
comment
@Kroltan В разделе глобальных переменных PEP8 говорит, что глобальные переменные должны быть отформатированы как функции, поэтому ALL_CAPS неверен. Я предполагаю, что pylint сложно проверить, используется ли переменная как константа или переменная, поэтому по умолчанию он разрешает только константы на уровне модуля, поскольку глобальные переменные обычно не рекомендуются в любом случае, и вы можете отключить pylint в случае - на индивидуальной основе для них. - person ws_e_c421; 27.08.2016

РЕДАКТИРОВАТЬ: Как уже упоминалось, pylint ожидает, что глобальные переменные должны быть в ВЕРХНЕМ РЕГИСТРЕ. Если предупреждения вас действительно беспокоят, вы можете обойти их, обернув небольшие фрагменты, подобные этому, в main()-функцию, а затем использовать if __name__ == "__main__"-соглашение. Или, если вам интересно, вы можете изменить регулярные выражения, которые pylint использует для проверки имен переменных.

От разработчиков Pylint.

В этом случае Pylint говорит мне, что эти переменные кажутся константами и все должны быть ЗАГЛАВНЫМИ. Это правило на самом деле является соглашением об именах, характерным для сотрудников Logilab, создавших Pylint. Именно так они решили назвать эти переменные. Вы тоже можете создавать свои собственные внутренние соглашения об именах, но для целей этого руководства мы хотим придерживаться стандарта PEP-8. В этом случае переменные, которые я объявил, должны следовать соглашению о строчных буквах. Подходящим правилом будет что-то вроде: «должен соответствовать [a-z_][a-z0-9_]{2,30}$». Обратите внимание на строчные буквы в регулярном выражении (a-z по сравнению с A-Z)

Вы можете проверить это, запустив: pylint --const-rgx='[a-z_][a-z0-9_]{2,30}$' x.py

person msvalkon    schedule 30.05.2012

Это связано с тем, что url_to_short объявлено в глобальном пространстве имен, а pylint требует, чтобы глобальные переменные (например, константы) назывались ALL_UPPERCASE.
Поэтому он проверяет, соответствует ли имя вашей переменной регулярному выражению, используемому для глобальных переменных, а именно: (([A-Z_][A-Z0-9_]*)|(__.*__))$ (обратите внимание на диапазоны A-Z ). Отсюда и ошибка Invalid name.

person rubik    schedule 30.05.2012