9

PylintはR: 73,0:MyLogging: Too many public methods (22/20)、次のコードのエラー()を報告し続けます。

class MyLogging(logging.Logger):

    def foo(self):
        pass

    def bar(self):
        pass

クラスには正確に22行のコードがあるため、最初はPylintのバグだと思いましたがMyLogging、基本クラスのすべてのパブリックメソッドも含まれていることに気付きlogging.Loggerました。これにより統計に20が追加されました。

基本クラスのパブリックメソッドをPylint統計から除外することは可能ですか?

PS:max-public-methodsより大きな数値に変更したり、1回限りの例外を追加したりできることは承知しています。# 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

上記のコードは、「_」で始まらないすべてのメソッドを単純に繰り返し、それらをパブリックメソッドとしてカウントします。

その結果、私はあなたがやりたいことをする2つの方法を見ます:

  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))
    

    基本的に、この実装は、Pylintソースコードからのdesign_analysis.MisdesignCheckerのわずかに変更された抜粋です。

プラグインの詳細については、Pylintが理解できないことを理解するためのヘルプとPylintソースコードを参照してください。

于 2013-01-18T07:59:26.050 に答える
2

現在、pylintには、親メソッドを無視できる構成はありません。私があなたのpbのために作成した問題が上流で解決されるまで、Romanlが提案していることを問題を回避することができます(http://www.logilab.org/ticket/116963)

于 2013-01-23T14:08:13.050 に答える