Pythonでインデントをスペース2つにした際の周辺ツールの設定

Pythonでインデントをスペース2つにした際のflake81autopep82の設定方法について書きます。

なぜPythonでインデントをスペース2つにするのか

Pythonのコーディング規約(PEP 8)ではインデントについて以下のように言及されています。

Use 4 spaces per indentation level.

しかし、最近の傾向としてインデントはスペース2つであることが多くなってきています。
例えば、Google Java StyleGoogle JavaScript Style Guideなどが挙げられます。また同じオフサイドルールを採用するCoffeeScriptでのコーディング規約でもスペース2つを採用する事例もあります。実際、スペースを4から2にすることによって、一行あたりに書けるコードも増え、結果的にコードをコンパクトにすることができます。
また、基本的に外部に公開することを想定していないプロジェクトの場合、上記のメリットを考慮し、インデントをスペース2つ分にすることも妥当だと思います。

インデントをスペース2つにすることで生じる問題

PythonのLinterやFormatterは基本的にPEP 8に準拠しているので、設定を変更しなければならないという問題とそれに付随する問題が発生します。例えばflake8を使用する場合、インデントについての検証を無視するように設定しなければならず、それ単体ではインデントがスペース2つ分であることが保証できません。

flake8の設定

インデント幅はスペース2つ分なので、このままではpep8のE111, E114(インデント幅はスペース4つ分でなければならない)を遵守することが出来ません。したがってflake8を各ルールごとに無視するか否かを設定することにします。

設定の方法としては、プロジェクトのルートディレクトリまで移動し、以下の内容をsetup.cfgとして置くだけです。

[flake8]
ignore = E111, E114

autopep8の設定

指定したルールを無視することは出来ましたが、このままでは書いたコードがインデント幅スペース2つ分になっていることを保証できません。この問題を解決するためにautopep8を用います。flake8ではインデント幅の指定はできませんが、autopep8であれば--indent-sizeオプションでインデント幅を設定できます。gulp-watchや watchdog、guard などでファイルの編集を監視しコードを編集すると同時にautopep8が走るようにしておけば、常にインデントが2の状態を維持できます。

まとめ

flake8やautopep8はPEP 8を守らせるツールです。しかし、設定を行うことによって、PEP 8の仕様を無視し、スペース2つ分のインデント幅のソースファイルでも利用できます。

参考


  1. pep8(コーディングスタイルチェック)とpyflake(エラーチェック)が合体したものに循環的複雑度(コードの複雑さ)を計測する等の機能を追加したものです。 
  2. pep8に則って、自動的にコードを整形するものです。