Что означает сообщение pylint "слишком мало публичных методов"
Я запускаю pylint на некотором коде и получаю ошибку "слишком мало публичных методов (0/2)". Что означает это сообщение? Элемент pylint docs не помогает:
используется, когда класс имеет слишком мало открытых методов, поэтому убедитесь, что это действительно стоит.
3 ответов:
ошибка в основном говорит, что классы не предназначены для просто хранить данные, так как вы в основном рассматриваете класс как словарь. Классы должны иметь по крайней мере несколько методов для работы с данными, которые они держат.
Если ваш класс выглядит так:
class MyClass(object): def __init__(self, foo, bar): self.foo = foo self.bar = barрассмотрите возможность использования словаря или
namedtupleвместо. Хотя, если класс кажется лучшим выбором, используйте его. pylint не всегда знают, что лучше.отметим, что
namedtupleis неизменяемые и значения, назначенные при создании экземпляра, не могут быть изменены позже.
Если вы расширяете класс, то я предлагаю систематически отключать это предупреждение и двигаться дальше, например, в случае задач сельдерея:
class MyTask(celery.Task): # pylint: disable=too-few-public-methods """base for My Celery tasks with common behaviors; extends celery.Task ...даже если вы расширяете только одну функцию, вам определенно нужен класс, чтобы сделать эту функцию техники, и расширение определенно лучше, чем взлом на сторонних классах!
это еще один случай
pylintслепые правила."классы не предназначены для хранения данных" - это ложное утверждение. Словари не годятся для всего. Элемент данных класса является чем-то значимым, элемент словаря является чем-то необязательным. Доказательство: вы можете сделать
dictionary.get('key', DEFAULT_VALUE)запретитьKeyError, но нет простого__getattr__по умолчанию.
NamedTupleне велик-особенно перед python 3-х годовtyping.NamedTuple: https://docs.python.org/3/library/typing.html#typing.NamedTuple - вы определенно должны проверить "класс, производный отNamedTuple" рисунок. Python 2 -namedtuplesсозданный из строковых описаний-это некрасиво, плохо и "программирование внутри строковых литералов" глупо.я согласен с двумя текущими ответами ("рассмотрите возможность использования чего - то другого, но pylint не всегда прав" - принятый и "используйте комментарий подавления pylint"), но у меня есть свой собственный предложение.
позвольте мне указать на это еще раз: некоторые классы предназначены просто для хранения данных.
теперь возможность также считают - используйте
property- ies.class MyClass(object): def __init__(self, foo, bar): self._foo = foo self._bar = bar @property def foo(self): return self._foo @property def bar(self): return self._barвыше у вас есть свойства только для чтения, что нормально для объекта Value (например, как в доменном дизайне), но вы также можете предоставить сеттеры - таким образом, ваш класс сможет взять на себя ответственность за поля, которые у вас есть, например некоторые проверки и т. д. (если у вас есть сеттеры, вы можете назначить их использование в конструкторе, т. е.
self.foo = fooвместоself._foo = foo, но осторожно, сеттеры могут предполагать, что другие поля уже инициализированы, а затем вам нужна пользовательская проверка в конструкторе).
Comments