Что означает сообщение pylint "слишком мало публичных методов"



Я запускаю pylint на некотором коде и получаю ошибку "слишком мало публичных методов (0/2)". Что означает это сообщение? Элемент pylint docs не помогает:




используется, когда класс имеет слишком мало открытых методов, поэтому убедитесь, что это действительно стоит.


575   3  

3 ответов:

ошибка в основном говорит, что классы не предназначены для просто хранить данные, так как вы в основном рассматриваете класс как словарь. Классы должны иметь по крайней мере несколько методов для работы с данными, которые они держат.

Если ваш класс выглядит так:

class MyClass(object):
    def __init__(self, foo, bar):
        self.foo = foo
        self.bar = bar

рассмотрите возможность использования словаря или namedtuple вместо. Хотя, если класс кажется лучшим выбором, используйте его. pylint не всегда знают, что лучше.

отметим, что namedtuple is неизменяемые и значения, назначенные при создании экземпляра, не могут быть изменены позже.

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

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

    Ничего не найдено.