2012-05-30 5 views
41

Я сделал простой скрипт python для публикации данных на веб-сайте.Pylint показывает недопустимое имя переменной на выходе

#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. Является ли именование переменной таким образом неправильным соглашением о кодировании.

Мой complete pylint output.

ответ

40

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

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

+4

Более особенно [именования часть] (http://www.python.org/ dev/peps/pep-0008/# именования) PEP8 –

+0

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

+2

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

4

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

17

EDIT: Как уже упоминалось, pylint ожидает, что глобальные переменные должны быть UPPERCASE. Если предупреждения действительно вас беспокоят, вы можете обойти их, обернув небольшие фрагменты, подобные этому, в функцию main(), а затем используйте проект if __name__ == "__main__". Или, если вам интересно, вы можете изменить регулярные выражения, используемые pylint для проверки имен переменных.

От developers от Pylint.

В этом случае Пилинт говорит мне, что эти переменные кажутся константами и должны быть все ВЕРХНИЙ. Это правило на самом деле является соглашением об именах, которое характерно для людей в Logilab, которые создали Pylint. Именно так они назвали эти переменные. Вы также можете создавать собственные собственные соглашения об именах, но для целей этого урока мы хотим придерживаться стандарта PEP-8. В этом случае объявленные переменные должны соответствовать стандарту всех строчных букв. Соответствующее правило будет выглядеть примерно так: «должно соответствовать [a-z _] [a-z0-9 _] {2,30} $". Обратите внимание на строчные буквы в регулярном выражении (аз против AZ)

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