Pylint: можно ли исключить из статистики унаследованные публичные методы?

Pylint продолжает сообщать об ошибке (R: 73,0:MyLogging: Too many public methods (22/20)) для следующего кода:

class MyLogging(logging.Logger):
    def foo(self):
        pass
    def bar(self):
        pass

Сначала я подумал, что это ошибка в Pylint, так как класс MyLogging имеет ровно 22 строки кода, но затем я понял, что он включает в себя и все общедоступные методы из базового класса logging.Logger, что добавляет 20 к статистике.

Знаете ли вы, можно ли исключить общедоступные методы базовых классов из статистики Pylint?

PS. Я знаю, что могу изменить max-public-methods на большее число или добавить однократное исключение с помощью # pylint: disable=R0904


person Jovik    schedule 15.01.2013    source источник


Ответы (2)


Есть способы, но ни один из них не является хорошим.

Это не настраивается: вы можете проверить код в pylint design_analysis.MisdesignChecker в def leave_class:

     for method in node.methods():
        if not method.name.startswith('_'):
            nb_public_methods += 1

Приведенный выше код просто перебирает все методы, не начинающиеся с "_", и считает их общедоступными.

Следовательно, я вижу два способа сделать то, что вы хотите сделать:

1) разветвите pylint и измените этот метод:

     for method in node.methods():
        if not method.name.startswith('_') and method.parent == node:
            nb_public_methods += 1

method.parent - узел класса, в котором определена эта функция; также в вашей функции leave_class у вас есть параметр node, который является узлом класса.

Сравнивая их, можно понять, текущий это класс или нет.

2) отключите это правило в конфиге pylint и создайте свой собственный плагин:

MAX_NUMBER_PUBLIC_METHODS = 3
class PublicMethodsChecker(BaseChecker):
    __implements__ = (IASTNGChecker,)

    name = 'custom-public-methods-checker'

    msgs = {
        "C1002": ('Too many public methods (%s/%s)',
              'Used when class has too many public methods, try to reduce \
               this to get a more simple (and so easier to use) class.'),
    }

    def leave_class(self, node):
        """check number of public methods"""
        nb_public_methods = 0
        print type(node)
        for method in node.methods():
            if not method.name.startswith('_') and method.parent == node:
                nb_public_methods += 1
        if nb_public_methods > MAX_NUMBER_PUBLIC_METHODS:
             self.add_message('C1002',
                         node=node,
                         args=(nb_public_methods, MAX_NUMBER_PUBLIC_METHODS))

в основном эта реализация представляет собой слегка измененную выдержку из design_analysis.MisdesignChecker из исходного кода pylint.

Дополнительные сведения о подключаемых модулях: http://www.logilab.org/blogentry/78354, а также в исходном коде pylint. .

person RomanI    schedule 18.01.2013
comment
Спасибо за ваш ответ. Временно я увеличил максимальное количество общедоступных методов. Я мог бы реализовать идею плагина, когда проект станет более зрелым и с ним будет работать больше разработчиков. - person Jovik; 24.01.2013
comment
Раздел плагинов Pylint также является хорошим справочником. docs.pylint.org/plugins.html - person Varun Katta; 05.06.2014

В настоящее время в pylint нет конфигурации, позволяющей игнорировать родительские методы. Вы можете делать то, что предлагает Романл, чтобы обойти проблему, пока проблема, которую я создал для вашего pb, не будет решена вверх по течению (http://www.logilab.org/ticket/116963)

person sthenault    schedule 23.01.2013