Pythonの静的解析ツールProspectorを使ってみよう
prospector について
ProspectorはPythonコードを解析し、エラー、潜在的な問題、規約違反、複雑さなどの情報を出力するツールです。
Pylint、pep8、McCabe のような他の Python 解析ツールを統合しています。
デフォルトおよびオプションの追加ツールの完全なリストについては、「サポートされているツール」のセクションを参照してください。
Prospector の主な開発指針は、「すぐに使えること」です。他のPythonの静的解析ツールの共通の不満は、どのエラーが自分のコーディングスタイルに関連しているかをフィルタリングするのに長い時間がかかることです。Prospector はいくつかのデフォルトプロファイルを提供しており、すぐに役立つことを期待しており、プロジェクトが使用するライブラリに応じて出力を調整します。
インストール
prospector は pip コマンドでインストールできます。
code: bash
$ pip install prospector
オプションの追加ツールの一覧と、各ツールのインストール例については、「サポートされているツール」を参照してください。
例えば、pyromaなどのオプションツールをインストールするには、次のようにします。
code: bash
Zsh を使用しているのであれば、次のように実行してください。
code: Zsh
2つ以上のオプションの追加ツールを同時にインストールするには、コンマで区切って(スペースを入れずに)指定する必要があります。例えば、mypyとbanditをインストールする場合は次のようにインストールします。
code: bash
オプションの追加ツールをすべて同時にインストールするには、with_everything オプションを使って prospector をインストールします。
code: bash
最良の結果を得るためには、自分のプロジェクトやその依存関係と同じ場所に prospector をインストールする必要があります。つまり、仮想環境を使用している場合は、コードと一緒に pip をその仮想環境にインストールします。これにより、使用しているライブラリの知識を推論して利用することができるため、基本的なツールがより良い結果を得ることができます。prospector をシステム全体にインストールして仮想環境のプロジェクトで使用すると、プロジェクトが使用しているライブラリに prospector がアクセスできないため、いくつかの誤ったエラーが表示されます。
使用方法
prospector を引数を与えずに実行するとカレントディレクトリのすべてのファイルに対してチェックを実行します。
code: bash
$ prospector
今、サンプルとして次のような Python コードがあるとして、このファイルだけをチェックしたいときはファイルパスを与えます。
code: sample.py
import sys
import numpy as np
import sys
dummy = ['Jack',
"Tony",
"David"
]
def launch_rocket ():
"""Launch
the
rocket. Go colonize space."""
code: bash
% prospector sample.py
Messages
========
sample.py
Line: 1
pylint: unused-import / Unused import sys
Line: 2
pylint: unused-import / Unused numpy imported as np
Line: 3
pylint: reimported / Reimport 'sys' (imported line 1)
pyflakes: F401 / 'sys' imported but unused (col 1)
pyflakes: F811 / redefinition of unused 'sys' from line 1 (col 1)
Line: 26
pylint: import-outside-toplevel / Import outside toplevel (math) (col 4)
Line: 27
pylint: import-outside-toplevel / Import outside toplevel (re) (col 4)
pylint: unused-import / Unused import re (col 4)
Line: 28
pylint: import-outside-toplevel / Import outside toplevel (os) (col 4)
pylint: unused-import / Unused import os (col 4)
Line: 38
pylint: bad-indentation / Bad indentation. Found 6 spaces, expected 8
Line: 39
pylint: trailing-newlines / Trailing newlines
Check Information
=================
Started: 2021-10-28 14:58:08.867429
Finished: 2021-10-28 14:58:13.224640
Time Taken: 4.36 seconds
Formatter: grouped
Profiles: default, no_doc_warnings, no_test_warnings, strictness_medium, strictness_high, strictness_veryhigh, no_member_warnings
Strictness: None
Libraries Used:
Tools Run: dodgy, mccabe, pep8, profile-validator, pyflakes, pylint
Messages Found: 12
他の静的解析ツールとどうようにチェックしてメッセージを出力しますが、ファイルを書き換えるようなことはしません。
出力の内容については、後ほど詳しく説明します。
出力フォーマット
prospectorのデフォルトの出力フォーマットは、人が読めるように設計されています。出力フォーマットは --output-format や -o フラグを使って変更することができます。
例えば、JSON 形式の出力を得るには --output-format json を使います。
table: prospector の出力形式
フォーマット 説明
emacs emacsのコンパイル出力モードのサポート
vscode vscode_python_pluginのサポート
grouped textに似ていますが、同じ行にあるすべてのメッセージをグループ化します
pylint "pylint --parseable" と同じスタイルで出力します
pylint の代わりに prospector を使うことができるようになります
json メッセージとサマリーの構造化されたパース可能なJSON形式を出力します
YAML YAML形式を出力する以外はJSONと同じです
xunit JSONと同じですが、xunit互換のXML形式で出力します
text デフォルトの出力形式で、人間が読めるシンプルな形式です
コードがフレームワークやライブラリを使用している場合
プロジェクトで使われているライブラリやフ レームワークによってクラスの属性が実行時に生成されることがあります。pylint を含む静的解析ツールでは、こうしたエラーで はないコードにエラーだと指摘してしまうことがよくあります。例えば、デフォルトでは、pylint は Django のモデルがオブジェクトにアクセスするとエラーを生成しますが、これは objects 属性が Model クラス定義の一部ではないためです。
Prospectorは、これらのフレームワークの理解を基礎となるツールに提供することで、この問題を軽減します。
Prospector は、requirements-detector を使って依存関係を検出し、必要なライブラリのサポートを自動的にオンにすることで、プロジェクトがどのライブラリを使用しているかを理解しようとします。どのアダプタが実行されたかは、レポートのメタデータセクションで確認できます。 Prospector がプロジェクトの依存関係を正しく検出できない場合、コマンドラインから手動で指定することができます。
code: bash
$ prospector --uses django --uses celery --uses flask
また、Prospectorが実際には使用していないライブラリを自動的に検出している場合は、自動検出を完全にオフにすることができます。
code: bash
$ prospector --no-autodetect
なお、これらのアダプタは、可能な限り基本的なツールのプラグインや拡張機能として書かれており、Prospectorを必要とせずに利用できるようになっています。例えば、 Django のサポートは pylint プラグインとして提供されています。
厳密性
Prospector には設定可能な 厳密性(strictness)レベルがあり、どの程度厳しくエラーを検索するかを決定します。
code: bash
$ prospector --strictness high
指定できる値は、verylow、low、medium、high、veryhigh です。
Prospectorは、デフォルトではドキュメントの警告(warnings)を含みませんが、--doc-warnings フラグを使用してこれをオンにすることができます。
prospector のコマンドラインオプション
--helpオプションだけを与えて実行すると簡単なヘルプメッセージが出力されます。
code: bash
% prospector --help
Performs static analysis of Python code
positional arguments:
PATH The path to a Python project to inspect. Defaults to
PWD if not specified. If multiple paths are specified,
they must all be files (no directories).
optional arguments:
-h, --help show this help message and exit
-0, --zero-exit Prospector will exit with a code of 1 (one) if any
messages are found. This makes automation easier; if
there are any problems at all, the exit code is non-
zero. However this behaviour is not always desirable,
so if this flag is set, prospector will exit with a
code of 0 if it ran successfully, and non-zero if it
failed to run.
-A, --no-autodetect Turn off auto-detection of frameworks and libraries
used. By default, autodetection will be used. To
specify manually, see the --uses option.
-u USES, --uses USES A list of one or more libraries or frameworks that the
project uses. Possible values are: django, celery,
flask. This will be autodetected by default, but if
autodetection doesn't work, manually specify them
using this flag.
-B, --no-blending Turn off blending of messages. Prospector will merge
together messages from different tools if they
represent the same error. Use this option to see all
unmerged messages.
-D, --doc-warnings Include warnings about documentation.
-T, --test-warnings Also check test modules and packages.
-8, --no-style-warnings
Don't create any warnings about style. This disables
the PEP8 tool and similar checks for formatting.
-m, --member-warnings
Attempt to warn when code tries to access an attribute
of a class or member of a module which does not exist.
This is disabled by default as it tends to be quite
inaccurate.
-F, --full-pep8 Enables every PEP8 warning, so that all PEP8 style
violations will be reported.
--max-line-length MAX_LINE_LENGTH
The maximum line length allowed. This will be set by
the strictness if no value is explicitly specified
-M, --messages-only Only output message information (don't output summary
information about the checks)
-S, --summary-only Only output summary information about the checks
(don'toutput message information)
-o OUTPUT_FORMAT, --output-format OUTPUT_FORMAT
The output format. Valid values are: emacs, grouped,
json, pylint, text, vscode, xunit, yaml. This will
output to stdout by default, however a target file can
be used instead by adding :path-to-output-file, eg, -o
json:output.json
--absolute-paths Whether to output absolute paths when referencing
files in messages. By default, paths will be relative
to the project path
-t TOOLS, --tool TOOLS
A list of tools to run. This lets you set exactly
which tools to run. To add extra tools to the
defaults, see --with-tool. Possible values are:
bandit, dodgy, frosted, mccabe, mypy, pep257, pep8,
profile-validator, pyflakes, pylint, pyroma, vulture.
By default, the following tools will be run: dodgy,
mccabe, pep257, pep8, profile-validator, pyflakes,
pylint
-w WITH_TOOLS, --with-tool WITH_TOOLS
A list of tools to run in addition to the default
tools. To specify all tools explicitly, use the --tool
argument. Possible values are bandit, dodgy, frosted,
mccabe, mypy, pep257, pep8, profile-validator,
pyflakes, pylint, pyroma, vulture.
-W WITHOUT_TOOLS, --without-tool WITHOUT_TOOLS
A list of tools that should not be run. Useful to turn
off only a single tool from the defaults. To specify
all tools explicitly, use the --tool argument.
Possible values are bandit, dodgy, frosted, mccabe,
mypy, pep257, pep8, profile-validator, pyflakes,
pylint, pyroma, vulture.
-P PROFILES, --profile PROFILES
The list of profiles to load. A profile is a certain
'type' of behaviour for prospector, and is represented
by a YAML configuration file. Either a full path to
the YAML file describing the profile must be provided,
or it must be on the profile path (see --profile-path)
--profile-path PROFILE_PATH
Additional paths to search for profile files. By
default this is the path that prospector will check,
and a directory called ".prospector" in the path that
prospector will check.
-s {veryhigh,high,medium,low,verylow}, --strictness {veryhigh,high,medium,low,verylow}
How strict the checker should be. This affects how
harshly the checker will enforce coding guidelines.
The default value is "medium", possible values are
"veryhigh", "high", "medium", "low" and "verylow".
--show-profile Include the computed profile in the summary. This will
show what prospector has decided the overall profile
is once all profiles have been combined and inherited
from. This will produce a large output in most cases
so is only useful when trying to debug why prospector
is not behaving like you expect.
-E, --no-external-config
Determines how prospector should behave when
configuration already exists for a tool. By default,
prospector will use existing configuration. This flag
will cause prospector to ignore existing configuration
and use its own settings for every tool. Note that
prospector will always use its own config for tools
which do not have custom configuration.
--pylint-config-file PYLINT_CONFIG_FILE
The path to a pylintrc file to use to configure
pylint. Prospector will find .pylintrc files in the
root of the project, but you can use this option to
specify manually where it is.
-p PATH, --path PATH The path to a Python project to inspect. Defaults to
PWD if not specified. Note: This command line argument
is deprecated and will be removed in a future update.
Please use the positional PATH argument instead.
-I IGNORE_PATTERNS, --ignore-patterns IGNORE_PATTERNS
A list of paths to ignore, as a list of regular
expressions. Files and folders will be ignored if
their full path contains any of these patterns.
-i IGNORE_PATHS, --ignore-paths IGNORE_PATHS
A list of file or directory names to ignore. If the
complete name matches any of the items in this list,
the file or directory (and all subdirectories) will be
ignored.
-X, --die-on-tool-error
If a tool fails to run, prospector will try to carry
on. Use this flag to cause prospector to die and raise
the exception the tool generated. Mostly useful for
development on prospector.
--include-tool-stdout
--direct-tool-stdout
--version show program's version number and exit
引数
PATH
検査するPythonプロジェクトへのパスです。指定されていない場合は PWD がデフォルトです。複数のパスを指定する場合、それらはすべてファイルでなければなりません。つまり、ディレクトリは指定することができません。
オプション
-0, --zero-exit
Prospector は、メッセージが見つかった場合、終了コード 1 で終了します。これにより、自動化が容易になります。何か問題があれば、終了コードはゼロではありません。しかし、この挙動は必ずしも望ましいものではないので、このフラグが設定されている場合、prospector は、実行に成功した場合はコード 0 で終了し、実行に失敗した場合は 0 以外のコードで終了します。
-A, --no-autodetect
使用するフレームワークやライブラリの自動検出をオフにします。デフォルトでは、自動検出が使用されます。手動で指定する場合は、-usesオプションを参照してください。
-u, --uses
プロジェクトが使用する1つまたは複数のライブラリまたはフレームワークのリストです。指定可能な値は django, celery, flask です。デフォルトでは自動検出されますが、自動検出がうまくいかない場合は、このフラグを使って手動で指定してください。
-B, --no-blending
メッセージのブレンドをオフにします。Prospectorは、異なるツールからのメッセージが同じエラーを表している場合、それらを統合します。このオプションを使用すると、マージされていないメッセージがすべて表示されます。
-D, --doc-warnings
ドキュメントに関する警告を含めます。
-T, --test-warnings
テストモジュールやパッケージもチェックします。
-8, --no-style-warnings
スタイルに関する警告を作成しません。これは、PEP8ツールや同様のフォーマットのチェックを無効にします。
-m, --member-warnings
存在しないクラスやモジュールのメンバーの属性にコードがアクセスしようとしたときに警告を出すようにします。これは、非常に不正確になる傾向があるため、デフォルトでは無効になっています。
-F, --full-pep8
すべてのPEP8警告を有効にして、すべてのPEP8スタイル違反が報告されるようにします。
--max-line-length
許容される最大の行の長さを指定します。値が明示的に指定されていない場合は、strictnessによって設定されます。
-M, --messages-only
メッセージ情報のみを出力します(チェックのサマリー情報は出力しません)。
-S, --summary-only
チェックの概要情報のみを出力します(メッセージ情報は出力しません)。
-o, --output-format
出力形式です。有効な値は、 emacs, grouped, json, pylint, text, vscode, xunit, yaml です。デフォルトでは標準出力に出力されますが、代わりに :path-to-output-file を追加して、ターゲットファイルを使用することができます(例: -o json:output.json
--absolute-paths
メッセージ中のファイルを参照する際に、絶対パスを出力するかどうかを指定します。デフォルトでは、プロジェクトのパスからの相対パスを出力します。
-t, --tool
実行するツールのリストです。これにより、実行するツールを正確に設定することができます。デフォルトに追加のツールを追加するには、-with-toolを参照してください。可能な値は、bandit, dodgy, frosted, mccabe, mypy, pep257, pep8, profile-validator, pyflakes, pylint, pyroma, vultureです。デフォルトでは、以下のツールが実行されます: dodgy, mccabe, pep257, pep8, profile-validator, pyflakes, pylint
-w, --with-tool
デフォルトのツールに加えて実行するツールのリストです。すべてのツールを明示的に指定するには、-tool 引数を使用します。指定可能な値は、bandit, dodgy, frosted, mccabe, mypy, pep257, pep8, profile-validator, pyflakes, pylint, pyroma, vultureです。
-W, --without-tool
実行してはいけないツールのリストです。デフォルトから1つのツールだけをオフにする場合に便利です。すべてのツールを明示的に指定するには、-tool 引数を使用します。指定可能な値は、bandit, dodgy, frosted, mccabe, mypy, pep257, pep8, profile-validator, pyflakes, pylint, pyroma, vulture です。
-P, --profile
ロードするプロファイルのリストです。プロファイルとは、prosposterの動作の「型」のことで、YAML設定ファイルで表されます。プロファイルを記述したYAMLファイルへのフルパスを指定するか、プロファイルパス上になければなりません(-profile-path参照)。
--profile-path
プロファイルファイルを検索するための追加のパスです。デフォルトでは、prosposterがチェックするパスの中に.prosposterというディレクトリが含まれます。
-s, --strictness
可能な選択肢: veryhigh, high, medium, low, verylow
チェッカーの厳密さを指定します。これは、チェッカーがコーディングガイドラインをどの程度厳しく適用するかに影響します。デフォルトの値は「medium」で、可能な値は「veryhigh」、「high」、「medium」、「low」、「verylow」です。
--show-profile
計算されたプロファイルをサマリーに含めます。これは、すべてのプロファイルが結合され、継承された後に、prospectorが決定した全体的なプロファイルを表示します。これはほとんどの場合、大きな出力を生成するので、prospector が期待したように動作しない理由をデバッグしようとする場合にのみ有用です。
-E, --no-external-config
あるツールの設定が既に存在している場合に、prospectorがどのように振る舞うかを決定する。デフォルトでは、prospector は既存の設定を使用します。このフラグを指定すると、prospector は既存の設定を無視し、すべてのツールに対して独自の設定を使用します。カスタム設定を持たないツールに対しては、prosposter は常に独自の設定を使用することに注意してください。
--pylint-config-file
pylintの設定に使用するpylintrcファイルへのパスです。Prospectorはプロジェクトのルートにある.pylintrcファイルを見つけますが、このオプションを使って手動でその場所を指定することができます。
-p, --path
検査するPythonプロジェクトへのパスを指定します。指定されていない場合のデフォルトは PWD です。Note: このコマンドライン引数は非推奨で、将来のアップデートで削除される予定です。代わりに位置指定の PATH 引数を使用してください。
-I, --ignore-patterns
無視するパスのリストを、正規表現のリストとして指定します。ファイルやフォルダのフルパスにこれらのパターンのいずれかが含まれている場合は無視されます。
-I, --ignore-paths
無視するファイルやディレクトリの名前のリストです。完全な名前がこのリストのいずれかの項目に一致した場合、そのファイルやディレクトリ(およびすべてのサブディレクトリ)は無視されます。
-X, --die-on-tool-error
ツールの実行に失敗した場合、prospector は実行を継続しようとします。このフラグを使うと prospector はツールが生成した例外を発生させて終了します。主に prospector の開発時に有用です。
--include-tool-stdout
--direct-tool-stdout
-version
プログラムのバージョン番号を表示して終了します。
プロファイル/設定
プロファイルを作成することで、prosposterの動作を設定することができます。プロファイルは、以下に説明するいくつかのセクションを含むYAMLファイルです。
Prospector はチェックしているパスの中で .prosposter.yaml ファイル (およびその他いくつかのファイル) を探します。見つかった場合は、自動的に読み込まれます。それ以外の場合は、引数としてプロファイルを渡すことができます。
code: bash
$ prospector --profile /path/to/your/profile.yaml
また、profile-path上にある場合は、パスの代わりに名前で指定することもできます。
code: bash
$ prospector --profile my_profile
プロファイルのパス
プロファイルの名前は、ファイル名から.yamlの拡張子を除いたものです。つまり、my_project.yaml という名前のプロファイルを作成した場合、その名前は my_project となります。継承は、プロファイルパスを検索して、継承リストの名前と一致するファイルを探すことで機能します。
profile-path は、Prospectorがプロファイルを探すときに検索する場所です。デフォルトでは、次のディレクトリを検索します。
組み込みプロファイルを含むディレクトリ
カレントディレクトリ(prospectorが動作しているディレクトリ)
カレントディレクトリにある .prospectorディレクトリを検索します。
検索する場所を追加するためには次のようにコマンドを実行します。
code: bash
$ prospector --profile-path path/to/your/profiles
プロファイルのサンプル
次のYAMLはプロファイルのサンプルです。
code: sample.yaml
output-format: json
strictness: medium
test-warnings: true
doc-warnings: false
inherits:
- my/other/profile.yml
ignore-paths:
- docs
ignore-patterns:
- (^|/)skip(this)?(/|$)
pep8:
disable:
- W602
- W603
enable:
- W601
options:
max-line-length: 79
mccabe:
run: false
組み込みプロファイル
Prospectorにはいくつかの組み込みプロファイルが用意されていて、厳密性さやスタイルのオプションを強化しています。
組み込みプロファイルの一覧は GitHub で公開されています。 グローバル設定オプション
ツールのグローバル設定オプションは以下の通りです。
output-format
strictness
doc-warnings
test-warnings
member-warnings
inherits
ignore-paths
ignore-patterns
autodetect
uses
max-line-length
output-format
同じコマンドラインオプションが使用できます。「出力フォーマット」を参照してください。
strictness
Prospectorがどの程度厳密に判断するかを調整するコマンドライン引数があります。
code: bash
$ prospector --strictness
これはプロファイルを使って実装されており、厳密性のレベルごとに無効にするメッセージのリストを示すだけです。
独自のプロファイルを作成する場合、strictnessを以下のように使用することができます。
code: YAML
strictness: medium
指定できる有効な値は、verylow、low、medium、high、veryhigh 、noneです。strictnessの値を指定しなかった場合は、デフォルトのmediumが使用されます。none を与えた場合は、Prospectorのデフォルトのstrictnessプロファイルを使用しなくなります。
分析の中には、ツールのstrictnessや個別のチューニングとは別に、オン/オフを切り替えることができるものがあります。例
doc-warnings
デフォルトでは、prosposter はドキュメントの欠落や docstring styleguide の違反に関する警告を出力しません。これらの警告を出力したい場合は、実行時に --doc-warnings フラグを使用するか、プロファイルに含めるようにしてください。
code: YAML
doc-warnings: true
これにより、無効になっていた pep257ツールが有効になります。
test-warnings
Prospectorは、デフォルトではユニットテストやテストファイルを検査しません。これは --test-warnings フラグまたはプロファイルを使ってオンにすることができます。
code: YAML
test-warnings: true
member-warnings
Pylintは、存在しないクラスの属性にアクセスしようとしたり、存在しないモジュールをインポートしようとしたりすると、警告を出力します。残念ながら、これは必ずしも正確ではなく、プロジェクトによってはこのメッセージが大量のノイズとなってしまいます。そのため、Prospectorはこれらのメッセージをデフォルトではオフにしていますが、--member-warningsフラグやプロファイルでオンにすることができます。
code: YAML
member-warnings: true
users / autodetect
Prospector は、プロジェクトが使用しているライブラリに基づいて、基本的なツールの動作を調整します。例えば、Django を使用している場合は、pylint-django プラグインがロードされます。これは自動的に行われます。
prospector がサポートしているライブラリのどれを使っているかを正しく判断できない場合は、プロファイルで手動で指定することができます。
code: YAML
uses:
- django
- celery
- flask
現在、Django、Flask、Celery のプラグインがあります。
prospector がこれらのうちのどれかを使っていると間違って判断している場合は、自動検出をオフにすることができます。
code: bash
$ autodetect: false
inherits
プロファイルは他のプロファイルを継承(inheritance)したり、複数のプロファイルを継承することができます。Prospectorは、各プロファイルのすべてのオプションを統合し、継承ツリーの一番上から始めて、下位にある値で上書きします。
上のプロファイルの例では、ユーザーが提供した別のプロファイル my/other/profile.yml を継承しています。これにより、例えば、プロジェクト全体のデフォルトプロファイルを、個々のリポジトリやライブラリごとに特定のオーバーライドを設定することができます。
組み込みのprosposterのプロファイルを継承することも可能ですが、組み込みのほとんどにはショートカットが用意されていますので、以下を参照してください。
code: YAML
inherits:
- strictness_medium
- full_pep8
無視セクションのようなリストについては、上書きされるのではなく統合されます。
継承セクションで指定したプロファイルは、プロファイルパス上になければなりません。
プロファイルを使用する場合、prosposterは自動的に厳密性を設定しないことに注意してください。プロファイルを提供すれば、どのメッセージをオンまたはオフにするかという情報がすべて提供されるという前提に立っています。厳密性の機能を維持するには、単に prospector の組み込みプロファイルを継承します。
code: YAML
inherits:
- strictness_medium
ignore-paths / ignore-patterns
パスやファイルを無視するには2つの方法があります。
ignore-paths セクションを使用する方法です。これは、リポジトリルートからの相対的な無視するパスのリストです。この場合、ディレクトリの内容とすべてのサブディレクトリが無視されますが、特定のファイルを無視することもできます。例えば、docs はリポジトリルートにある docs というディレクトリを無視し、mypackage/vendor は mypackage/vendor のディレクトリにあるものを無視します。
ignore-patterns セクションを使用する方法です。これには、正規表現のリストを与えます。ファイルやディレクトリの相対パスがそれぞれの正規表現で検索され、マッチするものがあれば無視されます。正規表現がディレクトリにマッチした場合、そのディレクトリの内容とすべてのサブディレクトリは無視されます。例えば,example/doc_.*\.py$ とすると,example ディレクトリ内の doc_ で始まるファイルはすべて無視されます。他にも例があります。(^|/)docs(/|$) とすると、リポジトリ全体でdocs と呼ばれるディレクトリをすべて無視します。
さらに ignore というオプションがあることに注意してください。これは ignore-patterns と同等のもので、古いバージョンの設定です。動作は継続しますが、非推奨となっていますので、これを使用している場合はプロファイルを更新してください。
max-line-length
このオプションは、許容される最大の行の長さを選択する方法を提供します。
注意
このオプションは、特定のツール(pep8またはpylint)の同じオプションよりも優先されます。
個別設定オプション
各ツールは、ツール名(小文字)で始まるセクションで個別に設定できます。有効な値は、bandit、dodgy、frosted,、mccabe、mypy、pep257、pep8、pyflakes、pylint、pyroma、vulture です。
ツールの有効化と無効化
ツールは、デフォルトで7種類、オプションで5種類あります。特に設定されていない限り、デフォルトは有効で、オプションのツールは無効です。
プロファイルでは、true / false を使ってツールを有効にしたり無効にしたりすることができます。
code: YAML
pyroma:
run: true
なお、コマンドライン引数--tools が使用されている場合は、プロファイルよりも優先されます。
メッセージの有効化と無効化
メッセージは、出力のためのツールのコードを使用して有効または無効にすることができます。これらのコードは、ツール自体が持っているか、メッセージコードを持たないツールのためにprosposterが提供しています。ツールとメッセージコードのリストは、ツールパッケージにあります。
一般的には、メッセージを無効にすることが望まれます。
code: YAML
pylint:
disable:
- method-hidden
- access-member-before-definition
ただし、親プロファイルで無効にしたメッセージを有効にすることもできます。
code: YAML
pylint:
enable:
- method-hidden
- access-member-before-definition
Pylintプラグイン
Pylint用のプラグインのリストを指定することができます。これは、pylintセクションのload-pluginsオプションを使って行います。
code: YAML
pylint:
load-plugins:
- plugin
- plugin
このオプションは、自動検出されたプラグインの読み込みには影響しないことに注意してください。
PEP8の制御
厳密性は、pep8.pyツールによって生成される異なるメッセージを、どれだけこだわりがあるかによってオンまたはオフにします。しかし、標準的な厳密性(medium)を持ちながら、pep8スタイルの警告を完全にしたい、あるいはゼロにしたい場合は、以下のような省略形を使うことができます。
警告を完全にしたい場合:
code: YAML
pep8:
full: true
警告ゼロにする場合
code: YAML
pep8:
none: true
このセクションは、後述のpep8ツールを設定するセクションでもあることに注意してください。したがって、pep8からのすべての警告をオンにすることができますが、1つまたは2つだけを個別にオフにしたり、そうでなければツールを微調整することができます。
code: YAML
pep8:
full: true
disable:
- E126
options:
max-line-length: 120
ツールオプション
いくつかのツールは、オプションハッシュを使ってさらに設定や微調整ができます。
code: YAML
pep8:
options:
max-line-length: 120
プロファイルのサンプル
次はサンプルプロファイルは、ほとんどのオプションを使った別の例です。
code: example.yaml
output-format: json
strictness: medium
test-warnings: true
doc-warnings: false
member-warnings: false
inherits:
- default
ignore-paths:
- docs
ignore-patterns:
- (^|/)skip(this)?(/|$)
autodetect: true
max-line-length: 88
bandit:
run: true
options:
config: .bandit.yml
dodgy:
run: true
frosted:
disable:
- E103
- E306
mccabe:
run: false
options:
max-complexity: 10
pep8:
disable:
- W602
- W603
enable:
- W601
options:
max-line-length: 79
pep257:
disable:
- D100
- D101
pyflakes:
disable:
- F403
- F810
pylint:
disable:
- bad-builtin
- too-few-public-methods
options:
max-locals: 15
max-returns: 6
max-branches: 15
max-statements: 60
max-parents: 7
max-attributes: 7
min-public-methods: 1
max-public-methods: 20
max-module-lines: 1000
max-line-length: 99
pyroma:
disable:
- PYR15
- PYR18
mypy:
run: true
options:
ignore-missing-imports: true
follow-imports: skip
vulture:
run: true
エラーの抑制
Prospectorのプロファイル設定は、Prospectorで実行されるツールによって報告されるエラーを微調整する機能を含むプロファイル/設定ファイルを介して行われます。ここでは通常、プロジェクト全体に影響する変更を行います。
また、特定の場所のエラーを抑制することも可能です。一般的には、エラーを発生させるツールのドキュメントサイトで、その方法を確認するのが一番良いでしょう。このページには、prospectorが追加する動作についての追加情報があります。
Pylintエラーの抑制
Pylintのエラーは、次のような形式のコメントを追加することで抑制することができます。
code: YAML
# pylint:disable=redefined-builtin
数値コード(W1101のようなもの)を使用することもできますが、pylintはシンボリック名を使用する方向に開発が進んでいるので、エラーの完全な名前を使用する方がよいでしょう。
Prospectorが、pylintがエラーを出したはずなのに抑制コメントでエラーが無効になっていることを発見した場合、他のツールからの同等のエラーもすべて抑制されます。
ファイル全体の無視
ファイルを無視する理想的な方法は、プロファイルの ignore-patterns と ignore-paths を使用することですが、既存のツールや設定がすでにリポジトリに存在している場合もよくあります。
flake8には、ファイル全体を無視するための次のような指示がありますが、これはprospectorでも採用されています。
code: python
# flake8: noqa
ファイルの特定行のエラー無視]
# noqa のコメントは、pep8やpyflakesが特定の行のすべてのエラーを無視するときに使用されます。Prospectorが# noqa のコメントに遭遇した場合、pylintやdodgyなどの他のツールを含むすべてのツールからのエラーを抑制します。
サポートされているツール
Prospectorは現在12のツールをサポートしており、そのうち7つはデフォルト、5つはオプションで追加されます。
ツールの有効化と無効化
Prospectorは、特に設定されていない限り、デフォルトを有効にし、オプションの追加機能を無効にして実行されます。
実行するツールの正確なリストを指定するには、たとえば、pylintとpep8のみを実行するようにします。
code: bash
$ prospector --tool pylint --tool pep8
このコマンドラインオプションは、プロファイルで設定された値を上書きすることに注意してください。
デフォルトに加えてオプションを指定することができます。例えば、次のように--with-toolオプションを使用すろと、デフォルトのツールに加えて、とpyromaを同時に実行することができます。
code: bash
$ prospector --with-tool pyroma
デフォルトツール
Pylint
Pylint は、Python 用の最も包括的な静的解析ツールです。非常に徹底しており、prospectorが出力するほとんどのメッセージの元となっています。
Pep8
Pep8は、PEP8スタイルガイドの違反を警告するためのシンプルなツールです。スタイルガイドから逸脱した場合にメッセージを出力します。
Prospectorの厳しさの概念は、厳しさのレベルに応じて様々な警告をオフにします。デフォルトでは、いくつかのPEP8エラーが抑制されます。他のツールの厳しさを調整せずにこれを調整するには、いくつかのオプションがあります。
code: YAML
# turn off pep8 checking completely:
prospector --no-style-warnings
# turn on complete pep8 checking:
prospector --full-pep8
# change the maximum line length allowed
# (the default varies by strictness):
prospector --max-line-length 120
Pyflakes
Pyflakes はプログラムを解析し、様々なエラーを検出します。pylintよりもシンプルで高速ですが、完全ではありません。
Mccabe
McCabeは、与えられた関数やメソッドの循環的複雑度(Cyclomatic complexity)を測定します。これはプログラムにどれだけ多くのパスがあるかや、関数がどれだけ複雑かを測定するもので、ある閾値に達すると警告します。複雑すぎるメソッドはロジックエラーを起こしやすいので、より小さなメソッドの集まりにリファクタリングする必要があります。
Dodgy
Dodgy は、秘密鍵、パスワード、AWS トークン、ソースコントロールの差分など、公開プロジェクトにあってはならない「いかがわしい」ものを見つけるために設計された、非常にシンプルなツールです。
Pydocstyle / Pep257
Pydocstyleは、PEP257 Docstring Conventionsの違反を警告するシンプルなツールです。このツールは、スタイルガイドからの逸脱に対してメッセージを生成します。
このツールは、コードを解析する機能にいくつかのバグがあるため、現在は実験的なものとされています。例えば、__all__ を含むモジュールは、__all__ が pydocstyle が期待する通りに正確にフォーマットされていないと、誤ったエラーメッセージを生成してしまう可能性があります。
これはデフォルトでは実行されないため、明示的に (--with-tool pep257 オプションを使うかプロファイルで指示) または暗黙的に (--doc-warnings オプションを使って) 有効にしなければなりません。
備考
Pep257は、以後、このドキュメントでこのツールに使われる名前です。
Profile-validator
これは、prosposterのプロファイルを検証する、prosposterに組み込まれたシンプルなツールです。
オプションツール
次にあげるオプションツールは prospector に統合されていますが、デフォルトでは有効になっていません。これは、これらの出力が必ずしもすべてのプロジェクトに有用ではないからです。
また、オプションツールはデフォルトではインストールされません。各ツールのインストール方法は、以下のツールセクションにあります。インストールの詳細については、「インストール」を参照してください。
Pyroma
Pyromaは、Pythonパッケージングエコシステムのベストプラクティスに従っていることを確認するために、setup.py をチェックするツールです。パッケージの品質を向上させるためのパッケージのメタデータが不足している場合には、警告してくれます。このツールは、PyPIでコードを公開する予定がある場合にお勧めします。
インストールと使用方法:
code: bash
$ prospector --with-tool pyroma
Vulture
Vultureは、コード内の使用されていないクラス、関数、変数を検出します。しかし、ダイナミックアクセスやメタプログラミングを多用する場合には、実際に使用されていないコードを警告することがあります。
インストールと使用方法:
code: bash
$ prospector --with-tool vulture
Frosted
Frosted は pyflakes のフォークで、開発が停滞した pyflakes を引き継ぎ、拡張する目的で作成されました。Prospector が最初に作成されて以来、pyflakes の開発は再び始まり、frosted は停滞しているため、オプションの追加に降格しました。
インストールと使用方法:
code: bash
$ prospector --with-tool frosted
Mypy
Mypyは実験的なオプションのPython用静的型チェックツールで、動的(または「ダック」)型付けと静的型付けの利点を組み合わせることを目的としています。Mypyは、Pythonの表現力と利便性を、強力な型システムとコンパイル時の型チェックと組み合わせています。
インストールと使用方法:
code: bash
$ prospector --with-tool mypy
Bandit
Banditは、Pythonコードに共通するセキュリティ問題を発見します。
インストールと使用方法:
code: bash
$ prospector --with-tool bandit
pre-commit
Git リポジトリ内のファイルに変更を加える際に Prospector を自動的に実行させたい場合は、pre-commit をインストールして、リポジトリの .pre-commit-config.yaml に以下のようにテキストを追加します。 code: .pre-commit-config.yaml
repos:
rev: 1.1.7 # The version of Prospector to use, at least 1.1.7
hooks:
- id: prospector
参考