Как бороться с сообщением Pylint "too-many-instance-attributes"?
Я только что попробовал вывести код с 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
Должен ли я упаковать геометрии в dict, сделать что-то еще, чтобы остановить жалобу Pylint или просто игнорировать ее (чего я действительно не хочу делать)?
Ответы
Ответ 1
ЛИНТЕР-задание должно информировать вас о потенциальных проблемах с вашим кодом, и, как вы говорите в своем вопросе, оно не должно содержать последнего слова.
Если вы считаете, что говорит 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)
Вы можете предотвратить появление этого сообщения одним из двух способов:
-
Добавьте флаг disable=
при запуске pylint:
$ pylint --disable=locally-disabled frob.py
-
Добавить директиву в конфигурационный файл pylintrc
:
[MESSAGES CONTROL]
disable = locally-disabled
Ответ 2
Это идеологическое возражение, но лично я стараюсь сделать подобные изменения как можно более универсальными. Если 7 экземпляров в одном файле недостаточно, и я решил разрешить это здесь, то почему не везде? Я не всегда вносю изменения в правила Lint по всем направлениям, но я, по крайней мере, считаю это. Для этого, если вы хотите внести изменения по всем направлениям, в вашем файле .pylintrc измените max-attributes=7
в разделе DESIGN
.
Поскольку я думаю, что 7 немного низко по всем направлениям, я изменил:
[DESIGN]
max-attributes=7
в
max-attributes=12
Ответ 3
Ответ от Zero Piraeus хороший. Тем не менее, поскольку вы предоставляете небольшой контекст вашему init методу, даже не реальному имени класса, трудно утверждать, но я бы сказал, что имя файла и moddir не имеют ничего общего с маржей, и др.
Операции IO часто лучше изолируются от функций, а не помещаются в методы. Их часто много разных форматов и вариантов сериализации, и большую часть времени вы не хотите
смешать их с вашей логикой объекта (методами). Легче добавить новую функцию ввода-вывода, которая принимает некоторый файл, строку, blob или что-то еще и возвращает объект, закодированный в нем, чем для поддержки объекта, который имеет множество методов, которые обрабатывают множество различных операций ввода-вывода.
Ответ 4
Я бы вообще отключил это сообщение, добавив 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