Я запускаю pylint для некоторого кода и получаю сообщение об ошибке «Слишком мало общедоступных методов (0/2)». Что означает это сообщение? Документы pylint бесполезны:
Используется, когда в классе слишком мало общедоступных методов, поэтому убедитесь, что оно того стоит.
Ответы:
Ошибка в основном говорит о том, что классы не предназначены только для хранения данных, поскольку вы в основном рассматриваете класс как словарь. Классы должны иметь по крайней мере несколько методов для работы с данными, которые они хранят.
Если ваш класс выглядит так:
Рассмотрите возможность использования словаря или
namedtuple
вместо него. Хотя, если класс кажется лучшим выбором, используйте его. pylint не всегда знает, что лучше.Обратите внимание, что
namedtuple
он неизменен, и значения, присвоенные при создании экземпляра, не могут быть изменены позже.источник
dict
илиnamedtuple
. Используйте класс, когда вы хотите добавить некоторую логику к своему объекту (например, вы хотите, чтобы что-то происходило при его создании, вам нужно, чтобы при его добавлении происходили какие-то особые вещи, вы хотите выполнять над ним некоторые операции, контролировать, как его отображается и т. д.)namedtuple
отстой - помимо уродливого синтаксиса, вы не можете задокументировать его или легко указать значения по умолчанию.namedtuple
я сожалел о решении. Непоследовательно разрешать как именованные, так и индексированные атрибуты доступа.Если вы расширяете класс, я предлагаю систематически отключать это предупреждение и двигаться дальше, например, в случае задач Celery:
Даже если вы расширяете только одну функцию, вам определенно нужен класс, чтобы эта техника работала, и расширение определенно лучше, чем взлом сторонних классов!
источник
min-public-methods=0
в[BASIC]
разделе файла конфигурации. Это позволяет вам поместить его в отдельную строку от всех вашихdisable=
вещей (в[MESSAGE CONTROL]
), что, как я считаю, упрощает добавление подробных комментариев о том, почему вы включили и отключили что-то вместе с изменением конфигурации.Это еще один случай
pylint
слепых правил России.«Классы не предназначены для хранения данных» - это ложное утверждение. Словари подходят не для всего. Член данных класса - это что-то значимое, элемент словаря - это нечто необязательное. Доказательство: вы можете сделать,
dictionary.get('key', DEFAULT_VALUE)
чтобы предотвратить aKeyError
, но по__getattr__
умолчанию нет простого .EDIT - рекомендуемые способы использования структур
Мне нужно обновить свой ответ. Прямо сейчас - если вам нужен
struct
, у вас есть два отличных варианта:а) Просто используйте
attrs
Это библиотека для этого:
https://www.attrs.org/en/stable/
Что вы получаете дополнительно: отказ от написания конструкторов, значений по умолчанию, проверки,
__repr__
объекты только для чтения (для заменыnamedtuples
, даже в Python 2) и многое другое.б) Используйте
dataclasses
(Py 3.7+)Следуя комментарию hwjp, я также рекомендую
dataclasses
:https://docs.python.org/3/library/dataclasses.html
Это почти так же хорошо, как
attrs
и стандартный библиотечный механизм («батарейки включены»), без дополнительных зависимостей, кроме Python 3.7+.Остальная часть предыдущего ответа
NamedTuple
не очень хорошо - особенно до Python 3typing.NamedTuple
: https://docs.python.org/3/library/typing.html#typing.NamedTuple - вам определенно следует проверитьNamedTuple
шаблон «класс, производный от ». Python 2,namedtuples
созданный из строковых описаний, уродлив, плох, а "программирование внутри строковых литералов" глупо.Я согласен с двумя текущими ответами («подумайте об использовании чего-то еще, но pylint не всегда правильный» - принятый и «используйте комментарий, подавляющий pylint»), но у меня есть собственное предложение.
Позвольте мне указать на это еще раз: некоторые классы предназначены только для хранения данных.
Теперь возможность также рассмотреть - используйте
property
-ies.Выше у вас есть свойства только для чтения, которые подходят для объекта значения (например, как в доменном дизайне), но вы также можете предоставить сеттеры - таким образом ваш класс сможет взять на себя ответственность за поля, которые у вас есть - например для выполнения некоторой проверки и т. д. (если у вас есть сеттеры, вы можете назначить их использование в конструкторе, то есть
self.foo = foo
вместо прямогоself._foo = foo
, но осторожного, сеттеры могут предположить, что другие поля уже инициализированы, и тогда вам понадобится настраиваемая проверка в конструкторе) .источник
attrs
библиотеку, которая на самом деле была планом для созданияdataclasses
модуля.namedtuples
имеют странный синтаксис наследования ... требуя, чтобы каждый класс, использующий один, знал, что это именованный кортеж, и использовал__new__
вместо__init__
.dataclasses
нет этого ограниченияТрудно, когда начальник ожидает принципа единственной ответственности, но Пилинт говорит нет. Так что добавьте второй метод в свой класс, чтобы ваш класс нарушил принцип единой ответственности. Насколько далеко вы собираетесь принять принцип единственной ответственности, - в глазах смотрящего.
Мое исправление,
Я добавил в свой класс дополнительный метод, так что теперь он выполняет две задачи.
Мне просто интересно, нужно ли мне теперь разделить мой класс на 2 отдельных файла и, возможно, на модули.
проблема решена, но не с моими коллегами, которые проводят весь день, обсуждая спецификацию, вместо того, чтобы заниматься ею, как будто это жизнь и смерть.
источник