Как бороться с Pylint "слишком-много-экземпляр-атрибуты сообщения"?

Я только что пытался Линт некоторый код с 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 ни раб к нему; вы используете его как полезный, но ошибочный инструмент.

по умолчанию 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
    

max-attributes=7 на .

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

[DESIGN]
max-attributes=7

до

max-attributes=12

ответ от нуля Пирей является хорошим. Тем не менее, поскольку вы предоставляете мало контекста для вашего init метод, даже не реальное имя класса, трудно быть утвердительным, но я бы сказал, что filename и moddir не имеют ничего общего с маржей, позицией и т. д.

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