Почему Pylint требует заглавных имен переменных вне функции? - PullRequest
0 голосов
/ 11 января 2019

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

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

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 и Capitalized. Переменная с заглавными буквами принимается (почему?), А camelCase отклоняется (я полагаю, что код не включен в функцию).

'''
Nothing important
'''

fileHandler = open("afile.txt")

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

которые дают по вызову пилинт:

$ 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)

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

Best

Ответы [ 2 ]

0 голосов
/ 16 января 2019

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

0 голосов
/ 11 января 2019

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

Python Script (без метода)

#!/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 . Удачи!

...