9

R: 73,0:MyLogging: Too many public methods (22/20)Pylint 不断报告以下代码的错误 ( ):

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

4

2 回答 2

6

有办法,但没有一个是好的。

这是不可配置的:您可以在 Pylint 的design_analysis.MisdesignChecker中检查代码def leave_class

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

上面的代码简单地遍历了所有不以“_”开头的方法,并将它们计为公共方法。

因此,我看到了两种方法来做你想做的事:

  1. fork 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))
    

    基本上,此实现是 Pylint 源代码中 design_analysis.MisdesignChecker 的稍微修改的摘录

有关插件的更多信息,请参阅帮助 pylint 了解它不了解的内容,以及 Pylint 源代码中的内容。

于 2013-01-18T07:59:26.050 回答
2

pylint 目前没有允许忽略父方法的配置。您可以按照 Romanl 的建议绕过问题,直到我为您的 pb 创建的问题在上游得到解决(http://www.logilab.org/ticket/116963)

于 2013-01-23T14:08:13.050 回答