PyCharmできれいなコードを書くために以下のツールを設定しました。
PyCharmは標準設定でもコードチェックや整形をやってくれます。それに加え、各種ツールを活用してコーディングルールに沿った開発をしていくことが目的です。
本記事では、PyCharmにファイル監視機能をつけて、保存のたびにチェックする設定方法をまとめます。
【更新履歴】
20.6.28|isortの設定を変更。multi_line_outputに関する設定を削除。importを1行表示とするためにforce_single_line=trueを追加。
20.5.27|isortを追加。flake8の設定を変更(1行の文字数を120 → 88)。
20.5.21|flake8などの設定を見直し
20.5.18|公開
File Watchersプラグイン(ファイル監視機能)
まずはファイルを監視してくれるプラグインを導入します。
Preferences → Plugins → file watchers
と検索してGo!!
インストールすると、Preferences → ToolsにFile Watchers
の項目が追加されます。ここに各種ツールの設定を書きます。
Black(コードフォーマッター)
BlackはPython3.6以上で使える超強力なコードフォーマッターです。PEP8に準拠しているのはもちろん、「より制限のきついPEP8」と言われている存在。ユーザーからはほとんど設定変更ができないガッチガチ仕様。
▶︎ The uncompromising code formatter
記事投稿時点ではベータ版なので、今後仕様変更される可能性はあります。
■設定
Blackの設定はpyproject.toml
を使用します。プロジェクト直下に生成し、1行の文字数を88(Blackデフォルト)にしました。
[tool.black]
line-length = 88
PyCharmのFile Watchersは以下のようにします。
項目 | 設定値 |
---|---|
Name | Black(任意名) |
File type | Python |
Scope | Current Fles or Project Filesなど |
Program | $PyInterpreterDirectory$/black |
Arguments | $FilePath$ |
Output paths to refresh | $FilePath$ |
Working directory | $ProjectFileDir$ |
Auto-save edited files to trigger the watcher | off |
Trigger the watcher on external changes | off |
black --help
やリファレンスを見ながら設定しました。
「Tool to Run on Changes」は、CUIでコマンド入力する状態をGUIから設定できるってイメージ。Blackは標準でpyproject.toml
を読み込むので、引数はPythonのファイルパスだけです。
■$xxxxxxxxxx$について
プロジェクトディレクトリなどを表すショートカットです。「Tool to Run on Changes」の各欄の「+」をクリックすると選択できます。
flake8(静的文法チェックツール)
flake8は静的な文法チェックツール。以下をラッパーしており、使っていない変数のチェックなど、「これおかしいよー」という箇所を検出してくれます。
- PyFlakes
- pycodestyle
- Ned Batchelder’s McCabe script
■設定
設定ファイルは一元管理したいのでpyproject.toml
に書きます。1行の文字数をBlackに合わせたり、循環的複雑度を設定しました。
[flake8]
max-line-length = 88
max-complexity = 20
項目 | 設定値 |
---|---|
Name | flake8(任意名) |
File type | Python |
Scope | Current Fles or Project Filesなど |
Program | $PyInterpreterDirectory$/flake8 |
Arguments | --statistics --config $ContentRoot$/pyproject.toml --ignore E203,W503,W504 $FilePath$ |
Output paths to refresh | $FilePath$ |
Working directory | $ProjectFileDir$ |
Auto-save edited files to trigger the watcher | off |
Trigger the watcher on external changes | off |
flake8 --help
やリファレンスを見ながら設定しました。
■ignoreの指定について
flake8で特定の警告やエラーを無効にしたい場合は、tomlファイルにこう書きます。
ignore = 'E203', 'W503', 'W504'
(Blackとの衝突を防ぐコード)
しかし、なぜかPyCharmではエラーとなります。tomlにエラーがあると他のチェッカーが誤動作しますので、回避策としてFile Watchersで「--ignore」指定することにしました。(テープルの設定値参照)
isort(コードフォーマッター)
isortはimport/from部分をPEP8に準じてソートしてくれるフォーマッターです。Blackはそこまで整形してくれないんですよね。
■設定
こちらもpyproject.toml
に書きます。Blackとの衝突を防ぐために文字数を合わせます。multi_line_output
には複数行になる場合のソート方法を指定します。
[tool.isort]
line_length = 88
force_single_line = true
(20.6.28 以下削除)
#include_trailing_comma = true
#multi_line_output = 3
項目 | 設定値 |
---|---|
Name | isort(任意名) |
File type | Python |
Scope | Current Fles or Project Filesなど |
Program | $PyInterpreterDirectory$/isort |
Arguments | $FilePath$ |
Output paths to refresh | $FilePath$ |
Working directory | $ProjectFileDir$ |
Auto-save edited files to trigger the watcher | off |
Trigger the watcher on external changes | off |
isort --help
でいろいろ確認できます。
■導入時の注意点
isortを普通にインストールすると~/.isort.cfg
を参照します。pyproject.toml
で一元管理するためにはpip install 'isort[pyproject]'
とするか、PyCharmからならOptions
にpyporject
を指定すればOKです。
mypy(静的型ヒントチェッカー)
mypyは静的な型ヒントチェッカーです。flake8と同じようなもので「適切に型ヒントかけているかな?」という観点でみてくれます。
■設定
こちらもpyproject.toml
に書いちゃいます。
[mypy]
ignore_missing_imports = 1
項目 | 設定値 |
---|---|
Name | mypy(任意名) |
File type | Python |
Scope | Current Fles or Project Filesなど |
Program | $PyInterpreterDirectory$/mypy |
Arguments | --config-file $ContentRoot$/pyproject.toml $FilePath$ |
Output paths to refresh | $FilePath$ |
Working directory | $ProjectFileDir$ |
Auto-save edited files to trigger the watcher | off |
Trigger the watcher on external changes | off |
mypy --help
でいろいろ確認できます。
Pylint(静的文法チェックツール)
Pylintは静的な文法チェックツールです。flake8と重複する部分もあるでしょうけど、両方採用して厳しめにチェックしてもいいだろうと。たとえば、flake8とPylintで引っ掛かったら、絶対に直すべきポイントだと思います。
■設定
Pylintもpyproject.toml
に設定できますが、.pylintrc
に書くことにしました。pylint --generate-rcfile
するとたくさんの標準設定があり、それらを有効にしておいた方が良いと考えたためです。
ただ、このままだと多くの変数にたいして「大文字にせぃ」とのたまってきます。変数は小文字が普通だと思うのですが(ですよね?)
というわけで、「名前について文句ゆーな」という設定やBlackとの衝突を防ぐための+αを.pylintrc
に書き込みます。
// 設定ファイル生成
$ pylint --generate-rcfile > .pylintrc
$ vim .pylintrc
// [MESSAGES CONTROL]セクションの”disable=”に以下を追記
+ invalid-name
+ bad-continuation
// [FORMAT]セクションで1行当たりの文字数を他と揃える
- max-line-length=100
+ max-line-length=88
// [DESIGN]セクションで最低バブリックメソッド数を変更(必要に応じて)
- min-public-methods=2
+ min-public-methods=0 or 1
項目 | 設定値 |
---|---|
Name | pylint(任意名) |
File type | Python |
Scope | Current Fles or Project Filesなど |
Program | $PyInterpreterDirectory$/pylint |
Arguments | --rcfile $ContentRoot$/.pylintrc $FilePath$ |
Output paths to refresh | $FilePath$ |
Working directory | $ProjectFileDir$ |
Auto-save edited files to trigger the watcher | off |
Trigger the watcher on external changes | off |
■Pylintは基本的に無効
僕の環境ではPylint処理にほんちょっと時間がかかります。保存のたびに「このちょっと」が気になるので、Pylintの自動処理を無効としておき、折を見て有効にしています。
有効・無効はFile Watchers設定画面のチェックボックスON/OFFでできます。
しばらく使ってみたところ、ちょっとした時間はとくに気にならないため常に有効としました。(2020.5.21)
設定ファイルはエクスポートしておくと楽
これまで設定したものを他のプロジェクトに流用できるよう、設定ファイルのインポート/エクスポート機能があります。
File Watchers設定画面の下部にある矢印アイコンがそれ。右上矢印がエクスポート、左下矢印がインポート。
pyproject.toml
や.pylintrc
も一緒に保存しておくと非常に楽ですよ。
おわりに
Pythonの良い点に「コードの読みやすさ」があります。でも、PEP8などのルールを無視して書いていたらその良さは活かせません。だから、この手のことはITの力に任せちゃいましょう。
今回はPyCharmで設定しましたけど、Visual Studio Codeでも同様の設定はできるので、自分の好きなエディタで開発を楽しんでいけばいいと思います。
参考にさせていただいた記事
ことの発端となった記事です。実務はこうなのか〜と知って「じゃあ、僕もやってみよう」となったのでした。
そのほかの参考記事はこちら。