Как бороться с сообщением Pylint "too-many-instance-attribute"?

Я только что попытался скопировать некоторый код с помощью Pylint, и последняя оставшаяся ошибка

R0902: too-many-instance-attributes (8/7)

Я понимаю причину ограничения количества атрибутов экземпляра, но семь кажется немного низким. Я также понимаю, что у линтера не должно быть последнего слова. Тем не менее, я хотел бы знать, что я должен делать вместо:

def __init__(self, output_file=None, output_dir=None):
    """
    Set the frobnicator up, along with default geometries
    """

    self.margin = 30

    self.pos = [0, 0]
    self.sep = [5, 5]

    self.cell = [20, 20]

    self.frobbr = library.Frobbr()

    page = self.frobbr.get_settings('page')

    self.lim = [page.get_width() - self.margin,
                page.get_height() - self.margin]

    self.filename = output_file
    self.moddir = output_dir

Должен ли я упаковать геометрию в диктовку, сделать что-то еще, чтобы Pylint не жаловался, или просто проигнорировать это (что я на самом деле не хочу делать)?

3 ответа

Решение

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

Если вы рассмотрели, что говорит pylint, и решили, что для этого класса у вас есть соответствующие атрибуты (что мне кажется разумным), вы можете как устранить ошибку, так и указать, что рассматривали проблему, добавив отключение. комментарий к вашему классу:

class Frobnicator:

    """All frobnication, all the time."""

    # pylint: disable=too-many-instance-attributes
    # Eight is reasonable in this case.

    def __init__(self):
        self.one = 1
        self.two = 2
        self.three = 3
        self.four = 4
        self.five = 5
        self.six = 6
        self.seven = 7
        self.eight = 8

Таким образом, вы не игнорируете Пилинт и не становитесь ее рабом; Вы используете его как полезный, но ошибочный инструмент.

По умолчанию Pylint выдаст информационное сообщение, когда вы локально отключите проверку:

 Locally disabling too-many-instance-attributes (R0902) (locally-disabled)

Вы можете предотвратить появление этого сообщения одним из двух способов:

  1. Добавить disable= флаг при запуске Pylint:

    $ pylint --disable=locally-disabled frob.py 
    
  2. Добавить директиву к pylintrc файл конфигурации:

    [MESSAGES CONTROL]
    disable = locally-disabled
    

Это идеологическое возражение, но лично я стараюсь сделать подобные изменения как можно более универсальными. Если 7 экземпляров в одном файле недостаточно, и я решил разрешить это здесь, то почему не везде? Я не всегда вносю изменения в правила Lint по всем направлениям, но я, по крайней мере, считаю это. С этой целью, если вы хотите внести изменения по всем направлениям, в вашем файле.pylintrc измените max-attributes=7 в DESIGN раздел.

Поскольку я думаю, что 7 немного низко по всем направлениям, я изменил:

[DESIGN]
max-attributes=7

в

max-attributes=12

Ответ от Zero Piraeus - хороший. Тем не менее, поскольку вы предоставляете мало контекста для вашего метода init, даже не реального имени класса, трудно быть утвердительным, но я бы сказал, что filename и moddir не имеют ничего общего с margin, position и т. Д.

Операции ввода-вывода часто лучше изолировать в функции, чем в методы. Часто это разные форматы и параметры сериализации, и большую часть времени вы не хотите смешивать их с логикой объекта (методами). Проще добавить новую функцию ввода-вывода, которая принимает некоторый файл, строку, большой двоичный объект или что-либо еще и возвращает закодированный в него объект, чем для поддержки объекта, который имеет много методов, которые обрабатывают множество различных операций ввода-вывода.

Я бы вообще отключил это сообщение, добавив too-many-instance-attributes к проекту pylintrc или .pylintrc файл, как в примере ниже:

[MESSAGES CONTROL]
disable=
    locally-disabled,
    locally-enabled,
    logging-format-interpolation,
    no-init,
    too-few-public-methods,
    too-many-instance-attributes,  # <-- Ensure at least this entry.
    fixme
Другие вопросы по тегам