Улучшение качества кода Python с помощью Pylint


Введение

В этой статье мы рассмотрим Pylint и то, как он используется для обеспечения соответствия вашего python-кода рекомендациям PEP8.

Что такое PEP8?

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

Содержание

  1. Что такое Pylint
  2. Установите Pylint
  3. Создайте простое приложение для викторины
  4. Запустите Pylint на нашем приложении викторины
  5. Внесите рекомендуемые изменения.
  6. Заключение

Что такое Pylint

Pylint — это инструмент python, который проверяет ошибки и пытается обеспечить соблюдение стандартов кодирования.

Установка Pylint

Установите Pylint через терминал pip install pylint или pip3 install pylint.

Создайте простое приложение для викторины

Создайте простое приложение для викторин на python, которое будет включать пять викторин из известного сериала «Теория большого взрыва», затем запустите Pylint и внесите рекомендуемые изменения.

Порядок действий:

  1. Создайте каталог проекта. Я назвал ее quiz_app.Запустите mkdir quiz_app в терминале.
  2. Перейдите в каталог quiz_app.Выполните команду cd quiz_app.
  3. Вы можете создать файл на этом этапе.Runtouch app.py
  4. Открыть Vs CodeCode .
  5. Откройте созданный файл и введите приведенный ниже код. В качестве альтернативы вы можете скопировать код непосредственно из этого репозитория.
import random
from string import ascii_lowercase
NUM_QUESTIONS_PER_QUIZ = 5
QUESTIONS = {
    "How old was Sheldon when he got his first P.h.d?": [
        "16",
        "18",
        "20",
        "22",
    ],
    "What’s Amy’s job": [
        "Neurobiologist",
        "Marine biologist",
        "Forensic biologist",
        "Microbiologist",
    ],
    "Which couple gets married first?": [
        "Bernadette and Howard",
        "Penny and Leonard",
        "Amy and Sheldon",
        "Emily and raj",
    ],
    "What is Leonard primary health concern?": [
        "He is lactose intolerant",
        "He is allergic to peanuts",
        "He has to eat gluten free",
        "He has diabetes",
    ],
    "Who does Howard meet while serving Thanksgiving dinner at a shelter?": [
        "Elon Musk",
        "Jeff Bezos",
        "Bill Gates",
        "Steve Jobs",
    ]
}

num_questions = min(NUM_QUESTIONS_PER_QUIZ, len(QUESTIONS))
questions = random.sample(list(QUESTIONS.items()), k=num_questions)

num_correct = 0
for num, (question, alternatives) in enumerate(questions, start=1):
    print(f"nQuestion {num}:")
    print(f"{question}?")
    correct_answer = alternatives[0]
    labeled_alternatives = dict(
        zip(ascii_lowercase, random.sample(alternatives, k=len(alternatives)))
    )
    for label, alternative in labeled_alternatives.items():
        print(f"  {label}) {alternative}")

    while (answer_label := input("nChoice? ")) not in labeled_alternatives:
        print(f"Please answer one of {', '.join(labeled_alternatives)}")

    answer = labeled_alternatives[answer_label]
    if answer == correct_answer:
        num_correct += 1
        print("⭐ Correct! ⭐")
    else:
        print(f"The answer is {correct_answer!r}, not {answer!r}")

print(f"nYou got {num_correct} correct out of {num} questions")
Вход в полноэкранный режим Выйдите из полноэкранного режима

Запустите Pylit на нашем приложении quiz_app

Теперь запустите pylint на приведенном выше коде. Если вы используете Vs Code, запустите bash и запустите pylint app.py. Вы должны указать файл python после pylint.
Также вы можете запустить pylint на терминале, перейдя в каталог quiz_app и выполнив команду pylint app.py.
После запуска pylint в командном окне будут отображены результаты Pylint. Результат показан ниже:

************* Module app
app.py:62:0: C0304: Final newline missing (missing-final-newline)
app.py:1:0: C0114: Missing module docstring (missing-module-docstring)
app.py:41:0: C0103: Constant name "num_correct" doesn't conform to UPPER_CASE naming style (invalid-name)
app.py:62:48: W0631: Using possibly undefined loop variable 'num' (undefined-loop-variable)

------------------------------------------------------------------
Your code has been rated at 8.18/10  
Вход в полноэкранный режим Выход из полноэкранного режима

Обратите внимание, что app.py:62:0 указывает, какая строка затронута, а C0304: — это код сообщения. В данном случае первая строка относится к нарушению стандарта кодирования в строке 62, столбец 0.
Существуют и другие коды сообщений, помимо приведенных выше. Ниже приведен список префиксов и их значений.

  • [R] Рефактор для нарушения стандарта кодирования «хорошая практика»
  • [C] Предупреждение за нарушение стандарта кодирования
  • [W] Предупреждение для стилистических проблем или незначительных проблем программирования
  • [E] Ошибка для важных проблем программирования (т.е., скорее всего, ошибка)
  • [F] Фатальная для ошибок, которые препятствуют дальнейшей обработке.

В конце показанного результата есть градация, которую делает Pylit. Эта градация показывает, насколько ваш код соответствует PEP 8. Этот код получил 8,18 из 10. Попробуйте довести его до 10 из 10.

Внесите рекомендуемые изменения

Создайте новый файл и назовите его app_modified.py. Скопируйте код из app.py, который будет использоваться для внесения рекомендуемых изменений.
Начните с C0103: Constant name "num_correct" doesn't conform to UPPER_CASE naming style (invalid-name) Как видите, pylint сообщает нам, что мы должны изменить num_correct на верхний регистр. Найдите и замените num_correct на NUM_CORRECT, используемый в трех случаях.
Запуск Pylint на этом этапе дает нам оценку 8,64 из 10.
Для C0114: Missing module docstring (missing-module-docstring). docstring — это краткое описание того, что делает ваш код, и оно может включать в себя конкретные аспекты кода. В основном она встречается в качестве первого утверждения в определении модуля, функции, класса или метода.
Мы добавим """Приложение-викторина, основанное на сериале: Теория большого взрыва"" в начале нашей программы.
Для C0304: Final newline missing (missing-final-newline), мы добавим пустую строку в конце нашей программы.
Мы можем игнорировать W0631: Using possibly undefined loop variable 'num' (undefined-loop-variable). Поскольку ее изменение повлияет на выполнение нашей программы.
Запуск Pylint на этом этапе дает нам оценку 9,55 из 10.
Ваш окончательный код будет похож на этот:

"""A quiz app based on the show: The Big Bang Theory"""
import random
from string import ascii_lowercase

NUM_QUESTIONS_PER_QUIZ = 5
QUESTIONS = {
    "How old was Sheldon when he got his first P.h.d?": [
        "16",
        "18",
        "20",
        "22",
    ],
    "What’s Amy’s job": [
        "Neurobiologist",
        "Marine biologist",
        "Forensic biologist",
        "Microbiologist",
    ],
    "Which couple gets married first?": [
        "Bernadette and Howard",
        "Penny and Leonard",
        "Amy and Sheldon",
        "Emily and raj",
    ],
    "What is Leonard primary health concern?": [
        "He is lactose intolerant",
        "He is allergic to peanuts",
        "He has to eat gluten free",
        "He has diabetes",
    ],
    "Who does Howard meet while serving Thanksgiving dinner at a shelter?": [
        "Elon Musk",
        "Jeff Bezos",
        "Bill Gates",
        "Steve Jobs",
    ]
}

num_questions = min(NUM_QUESTIONS_PER_QUIZ, len(QUESTIONS))
questions = random.sample(list(QUESTIONS.items()), k=num_questions)

NUM_CORRECT = 0
for num, (question, alternatives) in enumerate(questions, start=1):
    print(f"nQuestion {num}:")
    print(f"{question}?")
    correct_answer = alternatives[0]
    labeled_alternatives = dict(
        zip(ascii_lowercase, random.sample(alternatives, k=len(alternatives)))
    )
    for label, alternative in labeled_alternatives.items():
        print(f"  {label}) {alternative}")

    while (answer_label := input("nChoice? ")) not in labeled_alternatives:
        print(f"Please answer one of {', '.join(labeled_alternatives)}")

    answer = labeled_alternatives[answer_label]
    if answer == correct_answer:
        NUM_CORRECT += 1
        print("⭐ Correct! ⭐")
    else:
        print(f"The answer is {correct_answer!r}, not {answer!r}")

print(f"nYou got {NUM_CORRECT} correct out of {num} questions")

Вход в полноэкранный режим Выход из полноэкранного режима

Заключение

Существует множество инструментов, используемых для улучшения качества кода на python, Pylint — один из них. Подробнее об улучшении качества кода вы можете прочитать здесь.

Оцените статью
devanswers.ru
Добавить комментарий