web-dev-qa-db-ja.com

特定のモジュールまたはディレクトリのpylintメッセージを無効にする

テストファイルのためだけにPylintのduplicate-codeメッセージを無効にする方法はありますか?プロジェクトのすべてのテストはDAMPであるため、重複するコードは仕様によるものです。テスト全体で# pylint: disable=duplicate-codeを追加できることは理解していますが、test/フォルダーの下にあるすべてのファイルでこのルールを無効にするという何らかのルールを追加したいと思います。これを行う方法はありますか?

具体的には、「2回実行する」ソリューションとは異なるものを探しています(これは私がすでに頼っていたものです)。

8

それはpylintプラグインといくつかのハックで達成することができます。

次のディレクトリ構造があると仮定します。

 pylint_plugin.py
 app
 ├── __init__.py
 └── mod.py
 test
 ├── __init__.py
 └── mod.py

mod.pyの内容:

def f():
    1/0

pylint_plugin.pyのコンテンツ:

from astroid import MANAGER
from astroid import scoped_nodes


def register(linter):
    pass


def transform(mod):
    if 'test.' not in mod.name:
        return
    c = mod.stream().read()
    # change to the message-id you need
    c = b'# pylint: disable=pointless-statement\n' + c
    # pylint will read from `.file_bytes` attribute later when tokenization
    mod.file_bytes = c


MANAGER.register_transform(scoped_nodes.Module, transform)

プラグインがないと、pylintは次のように報告します。

************* Module tmp.exp_pylint.app.mod
W:  2, 4: Statement seems to have no effect (pointless-statement)
************* Module tmp.exp_pylint.test.mod
W:  2, 4: Statement seems to have no effect (pointless-statement)

プラグインがロードされている場合:

PYTHONPATH=. pylint -dC,R --load-plugins pylint_plugin app test

収量:

************* Module tmp.exp_pylint.app.mod
W:  2, 4: Statement seems to have no effect (pointless-statement)

pylintは、ソースファイル、このプラグインをトークン化することによってコメントを読み取ります ファイルの内容をその場で変更しますトークン化 の場合にpylintをごまかします。

デモンストレーションを簡略化するために、ここでは「無意味なステートメント」の警告を作成しました。他のタイプのメッセージを無効にするのは簡単です。

12
georgexsh

--disableまたは-dメッセージ制御フラグ があり、呼び出されたときにメッセージを選択的に無効にするために使用できます。したがって、プロジェクトフォルダー内からこれらのファイルに対してpylintを実行することにより、テストフォルダー内のすべてのファイルに対してこのメ​​ッセージを無効にすることができます。

pylint -d duplicate-code test/

重複コードエラーが発生しなかったため、そのメッセージを確認できませんでしたが、ディレクトリ内のすべてのファイルから特定のメッセージを切り取ることができることを確認できました。

これを、プロジェクトのメインディレクトリから実行するスクリプトに入れることもできます。何かのようなもの:

#!/bin/bash
pylint src/
pylint -d duplicate-code test/

または、これらのメッセージを除外する各ファイルの先頭に# pylint: disable=duplicate-codeを追加することもできます。これは、ファイルごとの選択的除外フラグがpylintに適用される限りのことのようです。

1
Engineero