Рубрики
Без рубрики

By-by Pylint

Первоначально опубликовано в моем блоге. Теперь я использовал Пилинт в течение почти десятилетия сейчас. Быстро вперед десять … с меткой Python, Pylint.

Первоначально опубликовано мой блог .

Я использовал Пилинт почти десяти лет сейчас.

Быстро вперед десять лет спустя, и я решил больше не использовать его.

Вот почему.

Давайте начнем с примера. Рассмотрим следующее, очевидно, неверный код:

def foo():
    ...

if __name__ == " __main__"
    foo(1, 2, 3)

Вот что может выглядеть вывод пилинта, когда вы запускаете его:

$ pylint foo.py
foo.py:4: [E1121(too-many-function-args),]
  Too many positional arguments for function call

Теперь давайте посмотрим несколько проблем, которые я встречал при использовании пилинта.

Начальная настройка

Первоначальная настройка пилинта всегда немного больна. Однако, если вы следите за некоторые советы Вы можете пройти через это.

Ложные негативы

Повторяющаяся проблема с Pyylint – это количество ложных негативов. То есть, когда пилинт думает, что что-то не так, но код совершенно нормально.

Например, мне нравится использовать attrs Библиотека всякий раз, когда у меня есть класс, который в основном содержит данные, как так:

import attr

@attr.s
class Foo:
    bar = attr.ib()
    baz = attr.ib()

Эти несколько строк кода дают мне хорошую читаемое человеком __repr__ , полный набор методов сравнения, разумных конструкторов (среди прочего), и без какой-либо котельной пластины.

Но когда я бегу Пилинт в этом файле я получаю:

foo.py:3: [R0903(too-few-public-methods), Foo] Too few public methods (0/2)

Ну, это совершенно нормально, чтобы требовать не менее 2 публичных методов для каждого класса, который вы объявляете. Большую часть времени, когда у вас есть класс с просто один Общественный метод лучше просто иметь функцию вместо этого:

# What you wrote:
class Greeter
    def __init__ (self, name="world"):
        self._name = name

    def greet(self):
    print("Hello", self.name)

# What you should have written instead:
def greet(name="world"):
    print("Hello" , name)

Но тут пилинт не знает обо всех приятных методах, добавляемых «динамически» по Attr И ошибочно предполагает, что наш дизайн неверно.

Таким образом, если вы запускаете Pylint во время CI, и вы не удалите сборку, если найден любая ошибка, вы должны вставить специально отформатированный комментарий для локально отключения этого предупреждения:

import attr

# pylint: disable=too-few-public-methods
@attr.s
class Foo:
  ...

Это быстро становится старой, особенно потому, что каждый раз, когда вы обновляете Pylint, вы получаете добавленную кучу чеков. Иногда они поймают новые проблемы в вашем коде, но вам все равно должны проходить через каждую новую ошибку, чтобы проверить, является ли она ложной положительной или реальной проблемой.

Но до сих пор мне удалось преодолеть те боли. Так что изменилось?

Произошло две вещи:

Во-первых, я начал использовать Mypy и «реальная» система типа 1 Отказ

То, что я нашел, так это то, что Mypy может поймать многие из ошибок, пилинта поймали бы, и, вероятно, больше.

Кроме того, поскольку он использует тип аннотации MAPY как быстрее, так и точнее, чем Pylint (потому что он не должен «угадать» что-нибудь).

Последнее, но не менее важное, MAPY также было разработано для использования постепенно , излучающие ошибки только тогда, когда это Конечно Здесь что-то не так.

Во-вторых, я решил портировать один из моих проектов в Python3.7. Мне пришлось поднять пилин от 1,9 до 2,1 (потому что более старые версии пийлинта не поддерживают Python3.7), и я получил 18 новых ошибок пилинта, который только один из них на самом деле актуальны.

Именно в этот момент я решил сделать шаг назад.

Как мы видели в этих примерах, сообщения об ошибках Pyylint содержат короткое имя для ошибки (например, слишком многофункционально-args ), и числовой идентификатор, префиксированный буквой ( E1121 ).

Каждое письмо соответствует пилинту категория Отказ

Вот полный список:

  • ( F ) Atal (что-то предотвращено пилингу от работы нормально)
  • ( E ) Ошибка (серьезная ошибка)
  • ( W ) Предупреждение (не очень серьезная проблема)
  • ( я ) НЛО (Ошибки, как не в состоянии разбирать # Pylint: отключить Комментарий)
  • ( C ) Огнеть (стиль кодирования)
  • ( R ) eactoring (код, который может быть написан более четким или нескольким питонным способом)

Обратите внимание, что Фатальный и Информация Категории полезны только тогда, когда мы пытаемся понять, почему Пилинт не ведет себя так, как он должен.

Я понял, что смогу использовать другие отряды (не только Marpy) для почти каждого цилинтовой категории.

  • Некоторые из Ошибка . Сообщения также могут быть пойманы Pyflakes который быстро и производит очень мало ложных положительных.
  • Конвенция Категория также можно позаботиться о Pycodestyle Отказ
  • Несколько Рефакторинг Предупреждения (но не все) также могут быть пойманы MCCABE , который измеряет сложность кода.

До сих пор я использую все тезисы линта в Дополнение к пилиту, как объяснено в Как я люблю мой питон

Но что, если я перестану с помощью пилинта в целом?

Все, что я бы проиграл, было бы некоторые из Рефакторинг Сообщения, но я предположил, что большинство из них поймают во время обзора кода. В обмен я мог бы избавиться от всех этих шумных # Pyylint: отключить Комментарии. ( 34 из них около 5000 строк кода)

И вот как я перестал с помощью пилинта и удалить его из моих сценариев CI. Мои извинения в пилинт авторы и сопровождающие: Вы все эти годы делали действительно отличную работу, но теперь я верю, что пришло время двигаться дальше и использовать новые и лучшие инструменты.

Это не конец истории о моих никогда не заканчивающихся поисками инструментов, чтобы помочь мне написать лучший код Python. Вы можете прочитать остальную часть истории в Привет Falke8 Отказ

Спасибо за чтение этого далеко:)

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

  1. Кстати, в конце Давая мишку Я сказал, что мне интересно знать, если Marpy поможет во время Массивный рефакторинг Отказ Ну, это сделало, даже лучше, чем я бы надеялся! ↩

Оригинал: “https://dev.to/dmerejkowsky/bye-bye-pylint-4chh”