Pythonの静的解析ツールPylintを使ってみよう
https://gyazo.com/862e10edd48c748f149934f749fb36fb
Pylintについて
Pylintは豊富な機能を備えているだけでなく、常にメンテナンスされているため、Python開発者にとって必須のツールと言えるでしょう。。Pylintは13年の歴史があり、その間にコーディングスタンダード、エラー検出、重複コードの検出によるリファクタリングなどの機能が追加されてきました。
Pylintは設定が簡単で、最小限の設定しか必要としませんが、必要に応じて設定ファイル .pylintrcを使って完全にカスタマイズすることができ、どのエラーや規約が自分のプログラムに関係するかを選択することができます。
また、VSCodeのデフォルトのリンターとして使われています。
インストールは pip コマンドで行います。
code: bash
$ pip install pylint
引数を与えないか、--helpオプションを与えて実行すると簡単なヘルプメッセージが出力されます。
code: bash
$ pylint --help
PYLINTHOME is now '/Users/goichiiisaka/Library/Caches/pylint' but obsolescent '/Users/goichiiisaka/.pylint.d' is found; you can safely remove the latter
Usage: pylint options
Options:
-h, --help show this help message and exit
--long-help more verbose help.
Master:
--init-hook=<code> Python code to execute, usually for sys.path
manipulation such as pygtk.require().
-E, --errors-only In error mode, checkers without error messages are
disabled and for others, only the ERROR messages are
displayed, and no reports are done by default.
-v, --verbose In verbose mode, extra non-checker-related info will
be displayed.
--ignore=<file>,<file>...
Files or directories to be skipped. They should be
base names, not paths. current: CVS
--ignore-patterns=<pattern>,<pattern>...
Files or directories matching the regex patterns are
skipped. The regex matches against base names, not
paths. current: none
--ignore-paths=<pattern>,<pattern>...
Add files or directories matching the regex patterns
to the ignore-list. The regex matches against paths.
current: none
--persistent=<y_or_n>
Pickle collected data for later comparisons. [current:
yes]
--load-plugins=<modules>
List of plugins (as comma separated values of python
module names) to load, usually to register additional
checkers. current: none
--fail-under=<score>
Specify a score threshold to be exceeded before
program exits with error. current: 10.0
--fail-on=<msg ids>
Return non-zero exit code if any of these
messages/categories are detected, even if score is
above --fail-under value. Syntax same as enable.
Messages specified are enabled, while categories only
check already-enabled messages. current: none
-j <n-processes>, --jobs=<n-processes>
Use multiple processes to speed up Pylint. Specifying
0 will auto-detect the number of processors available
to use. current: 1
(以下略)
使用方法は、pylint にファイルパスを与えて実行します。
code: bash
$ pylint オプション ファイルパ スファイルパス...
pylint は一度に複数ファイルを指示することができ、並列で処理させることができます。その場合は、次のように--jobs=N もしくは -j N で並列度を指示します。
code: bash
$ pylint -j 4 ファイルパ スファイルパス...
いま次のようなコードがあるので、pylint にかけてみましょう。
code: mandelbrot.py
import numpy as np
def mandelbrot(z: complex, max_iter: int):
c = z
for n in range(max_iter):
if abs(z) > 2:
return n
z = z*z + c
return max_iter
def mandelbrot_set(xmin: float, xmax: float,
ymin: float, ymax: float,
width: int, height: int,
max_iter: int):
horizon = np.linspace(xmin, xmax, width)
vertical = np.linspace(ymin, ymax, height)
return (horizon, vertical,
[mandelbrot(complex(r, i), max_iter)
for r in horizon for i in vertical] )
code: bash
% pylint mandelbrot.py
************* Module mandelbrot
mandelbrot.py:1:0: C0114: Missing module docstring (missing-module-docstring)
mandelbrot.py:3:0: C0103: Argument name "z" doesn't conform to snake_case naming style (invalid-name)
mandelbrot.py:3:0: C0116: Missing function or method docstring (missing-function-docstring)
mandelbrot.py:4:4: C0103: Variable name "c" doesn't conform to snake_case naming style (invalid-name)
mandelbrot.py:5:8: C0103: Variable name "n" doesn't conform to snake_case naming style (invalid-name)
mandelbrot.py:11:0: C0116: Missing function or method docstring (missing-function-docstring)
mandelbrot.py:11:0: R0913: Too many arguments (7/5) (too-many-arguments)
------------------------------------------------------------------
Your code has been rated at 4.17/10 (previous run: 4.17/10, +0.00)
デフォルトの出力フォーマットは次の通りです。
ファイル名;行数:カラム数:メッセージID:メッセージ
ほとんどのメッセージは説明不要ですが、メッセージIDの最初の文字は Convention、Refactor、Warning、Error に対応していて、コーディングスタイルに関しては PEP8スタイルガイに従っています
出力フォーマットはカスタマイズすることができます。
code: bash
% pylint --msg-template='{msg_id}:{line:3d},{column}: {obj}: {msg}' mandelbrot.py
************* Module mandelbrot
C0114: 1,0: : Missing module docstring
C0103: 3,0: mandelbrot: Argument name "z" doesn't conform to snake_case naming style
C0116: 3,0: mandelbrot: Missing function or method docstring
C0103: 4,4: mandelbrot: Variable name "c" doesn't conform to snake_case naming style
C0103: 5,8: mandelbrot: Variable name "n" doesn't conform to snake_case naming style
C0116: 11,0: mandelbrot_set: Missing function or method docstring
R0913: 11,0: mandelbrot_set: Too many arguments (7/5)
------------------------------------------------------------------
Your code has been rated at 4.17/10 (previous run: 4.17/10, +0.00)
設定ファイル
--generate-rcfileオプションだけ与えて実行すると設定ファイルを出力してくれるので、次のようにして設定ファイルを作成します。
code: bash
$ pylint --generate-rcfile > .pylintrc
ファイル名がドット(.)始まるをファイルは隠しファイルとなることに留意してください。
ここでは、例示の目的で、dot.pylintrc というファイルに保存します。
冗長ですが、抄訳した dot.pylintrc になります。これを見るだけでも pylint の機能の概要を知ることができるはずです。
code: dot.pylintrc
MASTER
# C拡張がロードされるパッケージやモジュールの名前をカンマで区切ったリストです。
# エクステンションはアクティブなPythonインタープリタにロードされ、
# 任意のコードを実行することができます。任意のコードを実行することができます。
extension-pkg-allow-list=
# C拡張がロードされるパッケージやモジュールの名前をカンマで区切ったリストです。
# 拡張はアクティブな Python インタープリタにロードされ、
# 任意のコードを実行することができます。
# (これは後方互換性のための extension-pkg-allow-list の代替名です)
extension-pkg-whitelist=
# これらのメッセージ/カテゴリーのいずれかが検出された場合、
# たとえスコアが --fail-under 値以上であっても、ゼロ以外の終了コードを返します。
# 構文は enable と同じです。指定されたメッセージは有効になり、
# カテゴリーはすでに有効になっているメッセージのみをチェックします。
fail-on=
# プログラムがエラーで終了する前に、スコアのしきい値を指定します。
fail-under=10.0
# スキップされるファイルまたはディレクトリ。
# パスではなくベース名で与える必要があります。
ignore=CVS
# regexパターンにマッチするファイルやディレクトリを無視リストに追加します。
# 正規表現はパスに対してマッチします。
ignore-paths=
# 正規表現のパターンに一致するファイルやディレクトリはスキップされます。
# 正規表現はパスではなくベース名に対してマッチします。
ignore-patterns=
# 実行するPythonコードです。
# 通常は pygtk.require() のように sys.path を操作するためのもの
#init-hook=
# 複数のプロセスを使用してPylintを高速化します。
# 0 を指定すると、使用可能なプロセッサ数を自動検出します。
jobs=1
# 1つのオブジェクトを推論する際に, 潜在的に推論される値の量を制御します。
# これにより、大きな関数や複雑なネストされた条件を扱う際の
# パフォーマンスを改善することができます。
limit-inference-results=100
# ロードするプラグインのリスト(Pythonモジュール名のカンマ区切り)です。
# 通常は追加のチェッカーを登録します。
load-plugins=
# 後で比較するためにデータを集めてピクル化するかどうか。yes/no
persistent=yes
# バージョン依存性のチェックに使用する Python の最小バージョン。
# pylintの実行に使われたPythonのバージョンがデフォルトになります。
py-version=3.9
# この機能を有効にすると、pylintは一般的な設定ミスを推測し、
# 誤ったエラーメッセージの代わりにユーザーフレンドリーなヒントを表示します。
suggestion-mode=yes
# 任意のC拡張の読み込みを許可する。
# 拡張機能はアクティブなPythonインタープリタにインポートされ、
# 任意のコードを実行することができます。
unsafe-load-any-extension=no
MESSAGES CONTROL
# リストアップされた信頼性レベルの警告のみを表示します。
# 空にすると全て表示されます。
# 有効なレベル HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED.
confidence=
# 指定されたIDを持つメッセージ、レポート、カテゴリ、チェッカーを無効にします。
# 複数のIDをカンマ(,)で区切って指定することもできますし、
# このオプションを複数回指定することもできます。
# (コマンドラインのみで, 設定ファイルでは1回しか指定できません)。
# "--disable=all "を使うと、最初にすべてのチェックを無効にしてから、
# 特定のチェックを再び有効にすることもできます。
# 例えば、類似性チェックだけを実行したい場合は、
# "--disable=all --enable=similarities" を与えます。
# クラスチェッカーだけを実行して、
# 警告レベルのメッセージを表示しないようにしたい場合は、
# "--disable=all --enable=classes --disable=W" を与えます。
disable=raw-checker-failed,
bad-inline-option,
locally-disabled,
file-ignored,
suppressed-message,
useless-suppression,
deprecated-pragma,
use-symbolic-message-instead
# 与えられたIDを持つメッセージ、レポート、カテゴリ、チェッカーを有効にします。
# コンマ(,)で区切って複数の識別子を指定することも、
# このオプションを複数回指定することもできます。
# (コマンドラインのみで、設定ファイルには一度しか表示されません)。
# "--disable "オプションの例も参照してください。
enable=c-extension-no-member
REPORTS
# 10以下のスコアを返すPython式です。
# 変数 'error', 'warning', 'refactor', 'convention' には、
# それぞれのカテゴリのメッセージ数が、
# また 'statement' には解析されたステートメントの総数が格納されています。
# このスコアはグローバル評価レポート(RP0004)で使用されます。
evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10)
# メッセージを表示するためのテンプレートです。
# これはメッセージの情報をフォーマットするために使われる
# Pythonの新しいスタイルのフォーマット文字列です。
# 全ての詳細はdocを参照してください。
#msg-template=
# 出力形式を設定します。
# 利用可能なフォーマットは次のものです。
# text, parseable, colorized, json, msvs (visual studio)
# mypackage.mymodule.MyReporterClassのように、
# レポータークラスを指定することもできます。
output-format=text
# レポート全体を表示するか、メッセージのみを表示するかを指定します。
reports=no
# 評価スコアを有効にする
score=yes
REFACTORING
# 関数/メソッド本体の最大ネストブロック数
max-nested-blocks=5
# 戻り値を持たない関数の完全な名前。
# 矛盾した戻り値の記述をチェックする際に、
# 戻り値を持たない関数が呼び出された場合、
# それは明示的な戻り値の記述とみなされ、メッセージは出力されません。
never-returning-functions=sys.exit,argparse.parse_error
LOGGING
# ロギングメソッドが行う文字列のフォーマットの種類です。
# 'old' は '%'形式を使用することを意味します。
# 'new' は '{}'形式を使用することを意味します。
logging-format-style=old
# ロギングモジュールで、文字列形式の引数がロギング機能の
# パラメータ形式であることを確認します。
logging-modules=logging
SPELLING
# スペルミスを指摘されたときに表示する回数を制限します
max-spelling-suggestions=4
# スペルの辞書名です。利用可能な辞書: なし。
# 動作させるには、python-enchant パッケージのインストールが必要です。
spelling-dict=
# コンマで区切られた単語のリストで、
# コメントの先頭に現れた場合は指示語とみなされ、
# チェックされるべきではありません。
spelling-ignore-comment-directives=fmt: on,fmt: off,noqa:,noqa,nosec,isort:skip,mypy:
# チェックしてはいけないコンマ区切りの単語のリスト。
spelling-ignore-words=
# 1行に1つの単語を含むプライベート辞書を含むファイルへのパス。
spelling-private-dict-file=
# 未知の単語を、メッセージを出す代わりに、
# プライベート辞書に保存するかどうかを指定します。
# --spelling-private-dict-file オプション参照
spelling-store-unknown-words=no
MISCELLANEOUS
# 考慮すべきノートタグのリストをカンマで区切って表示します。
notes=FIXME,
XXX,
TODO
# 考慮すべきノートタグの正規表現。
#notes-rgx=
TYPECHECK
# contextlib.contextmanagerのような、
# コンテキストマネージャーを生成するデコレーターのリストです。
# 有効なコンテキストマネージャーを生成する他のデコレーターを登録するときは、
# このリストに追加します。
contextmanager-decorators=contextlib.contextmanager
# 動的に設定され、pylintの推論システムが見逃しているため、
# アクセスされてもE1101を引き起こすべきではないメンバーのリストです。
# Pythonの正規表現が使えます。
generated-members=
# Mixinクラスでアクセスされた欠落したメンバーを無視するかどうかを指定します。
# クラス名が "mixin "で終わっている場合、mixinクラスが検出されます。
# 大文字小文字の区別はありません。
ignore-mixin-members=yes
# 属性の所有者がNoneと推測される場合に、
# メンバーの欠落について警告するかどうかを指定します。
ignore-none=yes
# このフラグは、推論時に不透明なオブジェクトが返された場合に、
# pylintが no-member や同様のチェックについて警告するかどうかを制御します。
# 推論は Python オブジェクトを評価しながら
# 複数の潜在的な結果を返すことができますが、
# いくつかのブランチは評価されないかもしれず、
# 結果として部分的な推論になります。
# その場合、推論された残りのオブジェクトに対しても
# no-member などのチェックを発することが有用かもしれません。
ignore-on-opaque-inference=yes
# メンバー属性をチェックしてはいけないクラス名のリストです。
# これは、動的に属性が設定されるクラスに有効です。
# これにより、修飾名の使用をサポートします。
ignored-classes=optparse.Values,thread._local,_thread._local
# メンバー属性をチェックしてはいけないモジュール名のリスト です。
# これは、実行時に名前空間が操作され、
# 静的な分析では既存のメンバー属性を推測できないモジュールに有用です。
# Unixのパターンマッチと同様に修飾されたモジュール名をサポートしています。
ignored-modules=
# メンバーの名前が見つからなかった場合に、候補となる名前のヒントを表示します。
# ヒントの探し方は、編集距離に基づいています。
missing-member-hint=yes
# 行方不明のメンバーの名前と類似しているとみなされるために、
# 名前が持つべき最小の編集距離です。
missing-member-hint-distance=1
# 行方不明のメンバーのヒントを示す際に考慮すべき類似の名前の総数です。
missing-member-max-choices=1
# デコレーションされた関数のシグネチャを変更するデコレータのリストです。
signature-mutators=
VARIABLES
# ビルドインで定義されることになっている追加の名前のリストです。
# 新しいビルトインを定義することは、
# できる限り避けるべきであることを覚えておいてください。
additional-builtins=
# 未使用のグローバル変数を違反として扱うかどうかを指示します。
allow-global-unused-variables=yes
# ビルドインをシャドーイングすることが許される名前のリスト
allowed-redefined-builtins=
# コールバック関数の名前を特定するための文字列のリストです。
# コールバック名は、これらの文字列のいずれかで始まるか終わる必要があります。
callbacks=cb_,
_cb
# ダミー変数の名前にマッチする正規表現です。
# すなわち、使用されないことが期待される変数。
dummy-variables-rgx=_+$|(_a-zA-Z0-9_*a-zA-Z0-9+?$)|dummy|^ignored_|^unused_
# この式にマッチする引数名は無視されます。
# デフォルトでは、先頭にアンダースコアを持つ名前になります。
ignored-argument-names=_.*|^ignored_|^unused_
# __init__ファイルで未使用のインポートをチェックするかどうかを指定します。
init-import=no
# ビルドインを再定義できるオブジェクトを持つことができる
# 修飾されたモジュール名のリストです。
redefining-builtins-modules=six.moves,past.builtins,future.builtins,builtins,io
FORMAT
# 空(任意の行末)、LFまたはCRLFなどの期待される行末のフォーマット。
expected-line-ending-format=
# 制限値より長くても許される行のためのRegexp。
ignore-long-lines=^\s*(# )?<?https?://\S+>?$
# ぶら下がり行や継続行の内側に必要なインデントのスペース数。
indent-after-paren=4
# インデントの単位となる文字列。
# 通常は " " (4つのスペース)、または "\t" (1つのタブ)です。
indent-string=' '
# 1行の最大文字数です。
max-line-length=100
# モジュールの最大行数。
max-module-lines=1000
# クラスのボディに単一のステートメントが含まれている場合、
# 宣言と同じ行にクラスのボディを置くことができます。
single-line-class-stmt=no
# else がない場合、ifの本体を条件式と同じ行に置くことを許可する。
single-line-if-stmt=no
SIMILARITIES
# コメントが類似性の計算から除外される
ignore-comments=yes
# docstrings が類似性の計算から除外される
ignore-docstrings=yes
# import が類似性の計算から除外される
ignore-imports=no
# シグネチャーが類似性の計算から除外される
ignore-signatures=no
# 相似と判断する最小ライン数。
min-similarity-lines=4
BASIC
# ネーミングスタイルが正しい引数名と一致する
argument-naming-style=snake_case
# 正しい引数名にマッチする正規表現。
# argument-naming-styleをオーバーライドします。
#argument-rgx=
# 正しいと判断する属性名のネーミングスタイル。
attr-naming-style=snake_case
# 正規表現による正しい属性名のマッチング。
# attr-naming-styleをオーバーライドします。
#attr-rgx=
# 常に拒否されるべき悪い変数名をカンマで区切って与えます。
bad-names=foo,
bar,
baz,
toto,
tutu,
tata
# 悪い変数名の正規表現をカンマで区切って与えます。
# どの正規表現にもマッチする名前は、常に拒否されます。
bad-names-rgxs=
# クラス属性名が正しいと判断するネーミングスタイル
class-attribute-naming-style=any
# 正規表現による正しいクラス属性名のマッチング。
# class-attribute-naming-styleをオーバーライドします。
#class-attribute-rgx=
# 正しいクラス定数名と判断するネーミングスタイル
class-const-naming-style=UPPER_CASE
# 正規表現による正しいクラス定数名のマッチング。
# class-const-naming-styleをオーバーライドします。
#class-const-rgx=
# 正しいクラス名と判断するネーミングスタイル
class-naming-style=PascalCase
# 正しいクラス名にマッチする正規表現。
# class-naming-styleをオーバーライドします。
#class-rgx=
# 正しい定数名と判断するネーミングスタイル
const-naming-style=UPPER_CASE
# 正規表現による正しい定数名のマッチング。
# const-naming-styleをオーバーライドします。
#const-rgx=
# docstringsを必要とする関数やクラスの最小行数で、短いものは除外されます。
docstring-min-length=-1
# 正しい関数名と判断するネーミングスタイル
function-naming-style=snake_case
# 正規表現による正しい関数名のマッチング。
# function-naming-styleをオーバーライドします。
#function-rgx=
# 常に受け入れられるべき良い変数名をコンマで区切って与えます。
good-names=i,
j,
k,
ex,
Run,
_
# 良い変数名と判断する正規表現をカンマで区切って与えます。
# どの正規表現にもマッチする名前は、常に受け入れられます
good-names-rgxs=
# 拒否された名前を含めて正しいネーミングフォーマットのヒントを出力します。
include-naming-hint=no
# 正しいインライン・イテレーション名と判断するネーミングスタイル
inlinevar-naming-style=any
# 正規表現による正しいインライン・イテレーション名のマッチング。
# inlinevar-naming-styleをオーバーライドします。
#inlinevar-rgx=
# 正しいメソッド名と判断するネーミングスタイル
method-naming-style=snake_case
# 正しいメソッド名にマッチする正規表現。
# method-naming-styleをオーバーライドします。
#method-rgx=
# 正しいモジュール名と判断するネーミングスタイル
module-naming-style=snake_case
# 正規表現で正しいモジュール名にマッチします。
# module-naming-style をオーバーライドします。
#module-rgx=
# コロンで区切られた名前のセットで、
# 名前の正規表現が複数のスタイルを許容する場合、
# お互いの名前のスタイルを決定します。
name-group=
# docstring を必要としない関数名やクラス名にのみマッチする正規表現です。
no-docstring-rgx=^_
# abc.abstractproperty のようなプロパティを生成するデコレータのリストです。
# このリストに追加して、有効なプロパティを生成する他のデコレーターを登録します。
# これらのデコレーターは、invalid-nameの場合のみ考慮されます。
property-classes=abc.abstractproperty
# 正しい変数名と判断するネーミングスタイル
variable-naming-style=snake_case
# 正規表現による正しい変数名のマッチング。
# variable-naming-styleをオーバーライドします。
#variable-rgx=
STRING
# モジュール内で引用符の区切りとして使用される文字が矛盾している場合に、
# inconsistent-quotesで警告を発生させるかどうかを制御します。
check-quote-consistency=no
# implicit-str-concatが、複数行に渡って定義されたシーケンスにおける
# 暗黙の文字列連結に対して警告を生成するかどうかを制御します。
check-str-concat-over-line-jumps=no
IMPORTS
# トップレベルのものだけでなく、
# どのレベルのものでもインポートできるモジュールのリスト。
allow-any-import-level=
# __all__を定義しているモジュールからのワイルドカードインポートを許可する。
allow-wildcard-with-all=no
# インポートフォールバックブロックを分析します。
# Python2とPython3の両方の互換性のあるコードをサポートするために
# 使用することができます。
# つまり、ブロックにはどちらか一方のインタープリタにのみ存在するコードが
# 含まれている可能性があり、分析されたときに偽陽性になる可能性があります。
analyse-fallback-blocks=no
# 使用してはいけない非推奨のモジュールをカンマで区切って与えます。
deprecated-modules=
# 外部依存性のグラフを指定されたファイルに出力します。
# .gvまたはサポートされている画像フォーマット。
# レポートRP0402は無効であってはいけません。
ext-import-graph=
# Output a graph (.gv or any supported image format) of all (i.e. internal and external) dependencies to the given file (report RP0402 must not be disabled).
# すべての(内部および外部の)依存関係のグラフを、
# 与えられたファイルに出力します。
# gvまたはサポートされている画像フォーマット。
# レポートRP0402は無効であってはいけません。
import-graph=
# Output a graph (.gv or any supported image format) of internal dependencies to the given file (report RP0402 must not be disabled).
# 内部依存関係のグラフを指定されたファイルに出力します。
# .gvまたはサポートされている画像フォーマット。j
# レポートRP0402は無効であってはいけません。
int-import-graph=
# 標準的な互換ライブラリの一部としてモジュールを認識するために、
# 強制的にインポートを行います。
known-standard-library=
# サードパーティのライブラリの一部としてモジュールを認識するために、
# 強制的にインポートします。
known-third-party=enchant
# コンマで区切られたモジュールと好ましいモジュールのカップル。
preferred-modules=
CLASSES
# 特別なメソッド内の保護された属性へのアクセスについて警告する
check-protected-access-in-special-methods=no
# インスタンス属性の宣言(割り当て)に使用されるメソッド名のリストです。
defining-attr-methods=__init__,
__new__,
setUp,
__post_init__
# 保護されたアクセスの警告から除外する必要のあるメンバー名のリスト。
exclude-protected=_asdict,
_fields,
_replace,
_source,
_make
# クラスメソッドの第一引数に有効な名前のリスト。
valid-classmethod-first-arg=cls
# メタクラスのメソッドの第1引数に有効な名前のリスト。
valid-metaclass-classmethod-first-arg=cls
DESIGN
# クラスの親をカウントする際に無視する修飾クラス名のリスト(R0901参照)
ignored-parents=
# 関数/メソッドの最大引数数。
max-args=5
# クラス属性の最大数(R0902参照)
max-attributes=7
# if文に含まれるブーリアン式の最大数(R0916参照)
max-bool-expr=5
# 関数/メソッド本体の最大分岐数。
max-branches=12
# 関数/メソッド本体の最大ローカルオブジェクト数。
max-locals=15
# クラスの親クラスの最大数 (R0901参照)
max-parents=7
# クラスのパブリックメソッドの最大数 (R0904参照)
max-public-methods=20
# 関数/メソッド本体の return / yield の最大数
max-returns=6
# 関数/メソッドの最大ステートメント数
max-statements=50
# クラスのパブリックメソッドの最小数 (R0903参照)
min-public-methods=2
EXCEPTIONS
# キャッチされたときに警告を発する例外です。
# デフォルトは "BaseException, Exception "です。
overgeneral-exceptions=BaseException,
Exception
出力フォーマットをカスタマイズする場合、前述の例では、コマンドラインのオプションを与えましたが、これを 設定ファイルdot.pylintrcで定義してみます。
具体t系には116行目を次のように修正します。
修正前:
code: python
#msg-template=
修正後:
code: python
msg-template="{msg_id}:{line:3d},{column}: {obj}: {msg}"
pylint を再度実行してみます。
code: bash
% pylint --rcfile dot.pylintrc mandelbrot.py
************* Module mandelbrot
C0114: 1,0: : Missing module docstring
C0103: 3,0: mandelbrot: Argument name "z" doesn't conform to snake_case naming style
C0116: 3,0: mandelbrot: Missing function or method docstring
C0103: 4,4: mandelbrot: Variable name "c" doesn't conform to snake_case naming style
C0103: 5,8: mandelbrot: Variable name "n" doesn't conform to snake_case naming style
C0116: 11,0: mandelbrot_set: Missing function or method docstring
R0913: 11,0: mandelbrot_set: Too many arguments (7/5)
------------------------------------------------------------------
Your code has been rated at 4.17/10 (previous run: 4.17/10, +0.00)
今回は、設定ファイルを dot.pylintrc としたので --rcfileオプションを与えて指示していますが、設定ファイルが、.pylintrcであればこのオプションは不要です。
Pyreverse
PylintにはPyreverseが同梱されており、コードのUML図を作成するのに使われています。
以前は独立したパッケージでしたが、pylint に取り込まれています。
pyreverse は与えた python プログラムを読み込んでUML図を生成してくれるツールです。実際の画像化には graphviz が必要になります。
code: sample.py
class ClassA(object):
def __init__(self, name):
self.name = name
def __repr__(self):
return f'ClassA(name="{self.name}")'
class ClassB(object):
def __init__(self, name):
self.name = name
def __repr__(self):
return f'ClassB(name="{self.name}")'
class ClassC(object):
def __init__(self):
self.object_b = ClassB()
def perform(self):
self.object_a = ClassA()
このファイルを pyreverse にかけてみましょう。
code: bash
$ pyreverse -o png sample.py
parsing sample.py...
$ ls
classes.png sample.py
すると、classes.pngが作成されます。これをプレビューすると次のようなります。
https://gyazo.com/2adf35dfa3af05dd87f41215510f5b0b
--outputオプション(もしくは -o)は変換する画像の拡張子を与えます。この指定がないと、grahpviz のdot形式で出力されます。
code: classes.dot
digraph "classes" {
rankdir=BT
charset="utf-8"
"sample.ClassA" color="black", fontcolor="black", label="{ClassA|name\l|}", shape="record", style="solid";
"sample.ClassB" color="black", fontcolor="black", label="{ClassB|name\l|}", shape="record", style="solid";
"sample.ClassC" color="black", fontcolor="black", label="{ClassC|object_a\lobject_b\l|perform()\l}", shape="record", style="solid";
"sample.ClassA" -> "sample.ClassC" arrowhead="diamond", arrowtail="none", fontcolor="green", label="object_a", style="solid";
"sample.ClassB" -> "sample.ClassC" arrowhead="diamond", arrowtail="none", fontcolor="green", label="object_b", style="solid";
}
この生成された classes.dot を graphviz の dot コマンドで処理して画像ファイルを生成させることもできます。
図中の緑色の文字が読みづらいので、fontcolor="green" を fontcolor="blue"などと変更すると良いかもしれません。
code: bash
$ dot -Tpng -oclasses.png classes.dot
https://gyazo.com/d68e6f05cb3add35760b36bd9763a220
graphviz の環境構築が面倒というのであれば、オンラインサービス も利用できます。