Python|きれいなコードを書くためにPyCharmを設定する

花村貴史のアイコン画像
Python

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 = true20.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からならOptionspyporjectを指定すれば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でも同様の設定はできるので、自分の好きなエディタで開発を楽しんでいけばいいと思います。

参考にさせていただいた記事

ことの発端となった記事です。実務はこうなのか〜と知って「じゃあ、僕もやってみよう」となったのでした。

そのほかの参考記事はこちら。

#PyCharm#Python
花村貴史のアイコン画像

Software Engineer & Photographer

花村貴史

Takashi Q. Hanamura

個人ではPython/Golang/JSを使い、オシゴトではWeb系システムを開発しつつ、週末は撮られ慣れてない方の笑顔や空気感をそっとすくい撮っています。
横浜育ち38年。脱サラ→信州移住2年半。2018年春から関西在住。翌年秋から夫婦生活スタート。関西に来てよかったことは京都が近くなったこと。