他のツールと Black を併用する

Black 互換の設定

Black の変更はすべて無害(少なくとも、そうあるべき)ですが、他のツールと競合するものがいくつかあります。リンターや型チェッカーなど、他のツールを Black と一緒に使用することは珍しくありません。それらのいくつかは、競合を解決するために少し調整が必要です。以下に、一般的なツール用のさまざまな形式での Black 互換の設定を示します。

ご注意くださいBlack は設定に TOML ファイル形式(例:pyproject.toml)のみをサポートしています。提供されている例は、それらのサポートされているファイル形式を使用して、対応するツールのみを設定するためのものです。

互換性のある設定ファイルはこちらにあります。

isort

isort は Python コードのインポートをソートおよびフォーマットするのに役立ちます。Black もインポートをフォーマットしますが、isort のデフォルトとは異なる方法であるため、変更が競合します。

プロファイル

バージョン 5.0.0 以降、isort は、一般的なコードスタイルとの簡単な相互運用を可能にするプロファイルをサポートしています。isort でサポートされている設定ファイルのいずれかで、black プロファイルを設定できます。以下に、pyproject.toml の例を示します。

[tool.isort]
profile = "black"

カスタム設定

5.0.0 より古い isort バージョンを使用している場合、または Black のカスタム設定がある場合は、isort 設定を調整して Black と互換性を持たせることができます。以下に、.isort.cfg の例を示します。

multi_line_output = 3
include_trailing_comma = True
force_grid_wrap = 0
use_parentheses = True
ensure_newline_before_comments = True
line_length = 88

なぜ上記のオプションなのか?

Black は、line-length を超えるインポートを、識別子を別の行に移動し、それぞれの後に末尾のカンマを追加することで折り返します。この動作の詳細な説明は、こちらにあります。

インポートが line_length 制限を超える場合の isort のデフォルトの折り返しモードは「Grid」です。

from third_party import (lib1, lib2, lib3,
                         lib4, lib5, ...)

このスタイルは Black と互換性がありませんが、isort は「Vertical Hanging Indent」と呼ばれる別の折り返しモードを使用するように設定できます。これは次のようになります。

from third_party import (
    lib1,
    lib2,
    lib3,
    lib4,
)

このスタイルは Black と互換性があり、multi-line-output = 3 で実現できます。また、上記のように、長いインポートを折り返す場合、Black は末尾のカンマを付け、括弧を使用します。isort は同じ動作に従う必要があり、オプション include_trailing_comma = True および use_parentheses = True を渡すことで設定されます。

オプション force_grid_wrap = 0 は、line_length 制限を超えるインポートのみを折り返すように isort に指示するためのものです。

最後に、isort には、Black のデフォルトの 88 文字の制限を超える場合に、line_length = 88 を介してインポートを折り返すように指示する必要があります。また、コメント付きのインポートセクションの間隔が Black と同じになるように、ensure_newline_before_comments = True も必要です。

ご注意ください ensure_newline_before_comments = True は isort >= 5 以降でのみ機能しますが、古いバージョンでは壊れないため、以前のバージョンを実行している場合でも保持できます。

形式

.isort.cfg
[settings]
profile = black
setup.cfg
[isort]
profile = black
pyproject.toml
[tool.isort]
profile = 'black'
.editorconfig
[*.py]
profile = black

pycodestyle

pycodestyle はコードリンターです。構文エラー、考えられるバグ、スタイルのエラーなどを警告します。ほとんどの場合、pycodestyle はスタイルエラーに関する警告時にPEP 8 に従います。Black との互換性のない偏差がいくつかあります。

設定

max-line-length = 88
ignore = E203,E701

なぜ上記のオプションなのか?

max-line-length

isort と同様に、pycodestyle は Black のデフォルトである 88 の長さ制限までの行を許可するように設定する必要があります。

E203

場合によっては、PEP 8 で決定されたように、Black はスライス演算子の周囲に等しい量の空白を強制します。このため、pycodestyle は E203 whitespace before ':' 警告を発生させます。この警告は PEP 8 に準拠していないため、無効にする必要があります。

E701 / E704

Black は、.. のみで構成されるクラスと関数の実装を 1 行に縮小します。これは、このような例が PEP 8 でフォーマットされる方法と一致します。他のすべてのケースで、Black は一般的にこれを推奨していない PEP 8 に従って、同じ行に複数のステートメントが出現するのを防ぎます。

ただし、pycodestyle はこのロジックを反映しておらず、この状況で E701 multiple statements on one line (colon) を発生させる場合があります。無効化されているデフォルトの E704 multiple statements on one line (def) ルールも警告を発生させる可能性があり、有効にするべきではありません。

W503

行を分割する場合、Black はバイナリ演算子の前に分割します。これは、2016年4月以降の PEP 8 に準拠しています。Flake8 には、この PEP 8 の推奨に反する W503 line break before binary operator という無効化されているデフォルトの警告があります。構成で有効にしないでください。代わりに、その対応する W504 line break after binary operator を使用できます。

形式

setup.cfg, .pycodestyle, tox.ini
[pycodestyle]
max-line-length = 88
ignore = E203,E701

Flake8

Flake8 は、pycodestyle を含む複数のリンターのラッパーです。そのため、同じ問題が多数あります。

Bugbear

Bugbear プラグインを使用し、Flake8 の E501 を使用する代わりに、その B950 チェックを有効にすることをお勧めします。これは、Black の 10% ルールに沿っているためです。

Bugbear をインストールし、次の構成を使用します。

[flake8]
max-line-length = 80
extend-select = B950
extend-ignore = E203,E501,E701

最小構成

Bugbear をインストールできない、またはインストールしたくない場合は、この最小限の互換性のある構成を使用できます。

[flake8]
max-line-length = 88
extend-ignore = E203,E701

なぜ上記のオプションなのか?

上記のpycodestyle セクションを参照してください。

形式

.flake8, setup.cfg, tox.ini
[flake8]
max-line-length = 88
extend-ignore = E203,E701

Pylint

Pylint は、Flake8 のようなコードリンターでもあります。Flake8 と同じチェックが多く、さらに多くのチェックがあります。特に、変数名のようなスタイルに関する規則に関するフォーマットチェックが数多くあります。

設定

max-line-length = 88

なぜ上記のオプションなのか?

Pylint は、max-line-length = 88 を介して 88 文字を超える行についてのみ文句を言うように設定する必要があります。

pylint<2.6.0 を使用する場合は、C0326C0330 も無効にしてください。これらは Black のフォーマットと互換性がなく、それ以降削除されています。

形式

pylintrc
[format]
max-line-length = 88
setup.cfg
[pylint]
max-line-length = 88
pyproject.toml
[tool.pylint.format]
max-line-length = "88"