Почему pylint требует имен переменных с заглавной буквы вне функции?

Почему pylint принимает переменные с заглавной буквы вне функции и отклоняет их внутри функции? И наоборот, почему pylint отклоняет camelCase вне функции и принимает его внутри функции?

Я только что установил pylint (версия 2.2.2), чтобы проверить свой Python 3. Должно быть что-то, что я пропустил. Мои соответствующие версии Python/пакета:

pylint 2.2.2
astroid 2.1.0
Python 3.6.7 | packaged by conda-forge | (default, Nov 20 2018, 18:20:05)
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.37)]

Рассмотрим следующий код (test_1), где я использую camelCase и заглавные буквы для переменных. Переменная с заглавной буквы принимается (почему?), а camelCase отклоняется (я думаю, потому что код не включен в функцию).

'''
Nothing important
'''

fileHandler = open("afile.txt")

for line in fileHandler:
    Token = line.split("\t")
    Part_1 = Token[0]
    print(Part_1)

Которые дают при вызове pylint:

$ pylint --py3k --enable=all  test_1.py 
************* Module test_1
test_1.py:5:0: C0103: Constant name "fileHandler" doesn't conform to UPPER_CASE naming style (invalid-name)

------------------------------------------------------------------
Your code has been rated at 8.00/10 (previous run: 8.00/10, +0.00)

Теперь, если я помещу все в функцию (test_2).

'''
Nothing important
'''

def foo():
    fileHandler = open("afile.txt")

    for line in fileHandler:
        Token = line.split("\t")
        Part_1 = Token[0]
        print(Part_1)

if __name__ == '__main__':
    foo()

Затем переменная с заглавной буквы определяется как несоответствующая (чего я и ожидал):

$ pylint --py3k --enable=all  test_2.py
************* Module test_2
test_2.py:5:0: C0102: Black listed name "foo" (blacklisted-name)
test_2.py:5:0: C0111: Missing function docstring (missing-docstring)
test_2.py:6:4: C0103: Variable name "fileHandler" doesn't conform to snake_case naming style (invalid-name)
test_2.py:9:8: C0103: Variable name "Token" doesn't conform to snake_case naming style (invalid-name)
test_2.py:10:8: C0103: Variable name "Part_1" doesn't conform to snake_case naming style (invalid-name)

------------------------------------------------------------------
Your code has been rated at 3.75/10 (previous run: 3.75/10, +0.00)

Что-то непонятно для меня... Любые разъяснения приветствуются...

Лучший


person dputhier    schedule 11.01.2019    source источник


Ответы (2)


Когда вы помещаете переменные внутрь функции, pylint больше не «видит» их как константы. После помещения переменных внутрь функции pylint «видит» их как обычные переменные и больше не требует, чтобы вы писали их с заглавной буквы, а вместо этого требует «snake_case». Обратите внимание, что по умолчанию pylint предпочитает snake_case camelCase, но вы можете переопределите это в .pylintrc, чтобы предпочесть camelCase.

Скрипт Python (без метода)

#!/usr/bin/env python3

# pylint wants 'FILEHANDLER'
fileHandler = open("afile.txt") # <-- pylint sees constant, wants UPPER_CASE 

for line in fileHandler:
    Token = line.split("\t")
    Part_1 = Token[0]
    print(Part_1)

Методом

#!/usr/bin/env python3

def run_stuff():

    # pylint wants 'file_handler'
    fileHandler = open("afile.txt") # <-- pylint sees normal variable

    for line in fileHandler:
        Token = line.split("\t")
        Part_1 = Token[0]
        print(Part_1)

if __name__ == '__main__':
    run_stuff()

Как правило, файлы .pylintrc следуют PEP8. Если ничего не указано, по умолчанию будет использоваться PEP8, как указано на веб-сайте Pylint. Удачного линтинга!

person Scott Skiles    schedule 11.01.2019
comment
Большое спасибо, Скотт, за ваш ответ. Я хорошо понимаю случай, когда fileHandler рассматривается как константа в test_1 и должен быть написан в верхнем регистре. Меня особенно беспокоит «Token and Part_1», который в test_1 должен быть записан как «token» и «part_1»? PEP8 указывает, что имя переменной должно быть в нижнем регистре. Таким образом, оба должны быть обнаружены как несоответствующие? Нет ? - person dputhier; 12.01.2019
comment
token и part_1 должны быть написаны строчными буквами, а не начинаться с прописных букв. - person Scott Skiles; 13.01.2019
comment
Да, они должны быть строчными. Итак, почему они принимаются pylint в test_1? - person dputhier; 16.01.2019
comment
Что ты спрашиваешь? Я ответил на ваш вопрос? - person Scott Skiles; 16.01.2019
comment
Я говорю о Token и Part_1. Это переменные с заглавной буквы (т.е. начинающиеся с заглавной буквы, например Foo), которые принимаются в циклах for и не должны. - person dputhier; 16.01.2019
comment
Извините, если мой вопрос был неясен, поскольку он смешал проблемы, связанные с переменными в верхнем регистре (FOO) и с переменными, начинающимися с прописных букв (Foo). Пожалуйста, смотрите мой ответ и проблему в github. Спасибо. - person dputhier; 16.01.2019
comment
НП. Похоже, ваш вопрос сильно изменился по сравнению с тем, который вы изначально опубликовали. - person Scott Skiles; 17.01.2019

Меня озадачил случай, когда переменные, написанные с заглавной буквы (т. е. начинающиеся с заглавной буквы, например, Token, Part_1), были приняты в циклах for (см. test_1), в то время как они должны были быть отклонены. Я разместил вопрос в github. Эта проблема выявила ошибку в pylint. https://github.com/PyCQA/pylint/issues/2695

person dputhier    schedule 16.01.2019