初めてのPython実践試験学習 第15回「Black様を使う時に知っておきたい知識」

こんにちは、吉政創成 菱沼です。

今回もPythonエンジニア育成推進協会のPython 3 エンジニア認定実践試験の主教材「Python実践レシピ/技術評論社」を使って学習中です。

前回は、Blackのオプションや使い方、設定に使うpyproject.tomlの書き方について学びました。

今回は、Blackの補足的な部分になります。

Blackの学習に関するほかの記事に興味がある方はこちらをご覧ください。

初めてのPython実践試験学習 第13回「コードフォーマッターBlack様」

初めてのPython実践試験学習 第14回「Black様とオプションとpyproject.toml」

Black様をVS Codeで使えるようにする設定

Blackはコマンドプロンプト(Windows)からだけでなく、Visual Studio Code(VS Code)やPyCharmなどのいろいろなエディターでも利用することが可能です。私はVS Codeを利用しており、設定はしたかあやふやですが、使えるようにだけはしたという認識でおりましたが、もう一度やり直しました。

今回はVS Codeでの設定方法です。すでにVS Codeのインストールが完了していることが前提です。

—————————
P.36

1.Visual Studio Codeのマーケットプレイスにて「Python」機能拡張をインストールする
https://marketplace.visualstudio.com/items?itemName=ms-python.python

2.Visual Studio Codeの設定より次の設定を変更する
  1.python.formatting.providerより「black」を選択
  2.editor.formatOnSaveにチェック(true)

また関連するオプションとして、次の設定もできます。
・python.formatting.blackPath:環境ごとにBlackのパスを設定する
・python.formatting.blackArg:オプションを指定する

—————————

上記のURLはVS CodeでPythonを使えるようにするのに必要な作業です。URLからでなくとも、VS Codeの拡張機能の画面からでもインストールできます。が、Pythonがついている拡張機能はたくさんあるので、URLからの方が楽だと思います。

次に、VS Codeでの設定になりますが、ここで大いに転びました。

なんと、「python.formatting.provider」の項目が見当たらないのです…。調べてみたところ、書籍が発売された(2022年)後に機能が変更されていました。変更点と変更後の設定方法は次の通りです。

<変更点>

  1. Python拡張機能に内蔵されていたLintingとFormattingが、独立した拡張機能へ移行し、python.formatting.provider や python.linting.*を使った設定が非推奨となった。
  2. それに伴い、Blackの機能は新拡張機能である「Black Formatter」として提供されることになった。

結果、Blackを使う場合は、Black Formatterの拡張機能をインストールした上で、setting.jsonに以下の設定を追加することになりました。

{
    “[python]”: {
        “editor.defaultFormatter”: “ms-python.black-formatter”    
}
}

※”ms-python.black-formatter” は、Black Formatter拡張機能のIDです

なお、書籍にあった2のeditor.formatOnSaveの項目は現在も有効のまま残っているので、UIからチェックを入れる形でもOKですし、setting.jsonに記述してもOKです。UIからチェックを入れる方法で設定したい場合は、[ファイル]→[ユーザー設定]→[設定]を開き、検索窓に「editor format on save」と入力すると出てきます。

“editor.formatOnSave”: true

また、関連するオプションの設定についても書籍に書かれていましたが、こちらもこの変更に伴い、独立した機能であるBlack Formatterに取り込まれているか、設定不要な形になっており、オプションを設定したい場合は、前回のコラムで学んだpyproject.tomlに記述する形になっているようです。

これに関連したMicrosoftのアナウンスは以下のページからご覧いただけます。興味がある方はご一読ください。

Python in Visual Studio Code – November 2023 Release
Formatter extension for Visual Studio Code using the Black formatter(MSマーケットプレイス)
Formatting Python in VS Code(VS Code 公式ドキュメント)

リンターやフォーマッターで使う設定ファイルの種類

次の項目ではBlackの周辺知識について書かれています。

前回、Blackのオプションの設定方法として、pyproject.tomlを学びましたが、pyproject.tomlはmypyでも使えるんだそうです。ただ、Flake8には今も対応していないそうです。

なので、使うツールによって設定ファイルもそれに適したものを利用しなければならないということで、ここではblack、Flake8、mypyで使える設定ファイルについて紹介されています。

—————————
P.36
Flake8やBlack、また静的型チェックツールであるmypy(「5.2 静的型チェックを行う-mypy」(p.115)を参照)は、エディターやIDEでの利用と、pre-commitやCIなどでの自動チェックの併用がお勧めです。
(中略)
どの設定ファイルにどのツールの設定が可能か、一覧にして紹介します。

ファイル種別BlackFlake8mypy
pyproject.toml×
setup.cfg×
その他のファイル.config/black, .black.flake8, tox.inimypy.ini, .mypy.ini

(中略)
また、Flake8で設定可能なファイルとして、tox.iniがあります。これはtoxというテストツールの設定ファイルです。Toxではテストの実行に加え、Flake8、Black、mypyの実行も指定できます。

—————————

pre-commitとは、Gitのフックという機能だそうで、gitコマンドを使ってコミットする前に、コードチェックや整形を自動で行ってくれるものだそうです。Gitについて改めて知りたい方は、Pythonエンジニア育成推進協会の顧問理事 寺田さまの以下のコラムをご参照ください。
バージョン管理システム「Git」とは何者か、活用のすすめ

また、TOXについて知りたい方はこちらをどうぞ。
https://tox.wiki/en/4.27.0

BlackとFlake8を併用するとき出がちな衝突の回避方法

Blackの章、最後となるのはよくあるエラーと対処法です。
ここでは併用されるシーンが多いらしいBlackとFlake8の衝突を回避する方法が書かれています。

—————————
P.37
BlackでフォーマットしたファイルをFlake8でチェックすると、いくつかの衝突が起こります。BlackとFlake8を併せて利用する場合、衝突が発生しないようにするための設定をFlake8に追加しましょう。

以下の「max-line-length」(1行の最大文字数)はデフォルト値が異なるため、「extend-ignore = E203」は「:」の前後の空白に対するルールが異なるため、それぞれ必要です。

Blackと衝突しないための最小限のFlake8の設定

[flake8]
max-line-length = 88     # 1行の最大文字数がFlake8とBlackで異なるためそろえる
extend-ignore = E203    # Flake8のエラーE203を除外する

—————————

リンターであるFlake8は、コードに潜在的なバグがないかどうかをチェックする役割を持ちます。そして、エラーの指摘はしますが、コードの修正は行いません。一方、フォーマッターであるBlackは、PEP8に基づいて、厳格にコードをチェックし、自動的にコードを整形します。そこに議論の余地はありません。

この二つを併用することは開発現場ではよくあることだそうですが、それぞれがもつ規定に少々違う部分があるため、Flake8の設定をBlackの方に合わせてあげる必要があるそうです。その競合してしまう部分が、引用文中にある1行の最大文字数の設定と、Flake8のエラーE203ということになります。

  • 1行の最大文字数

Blackは88文字、Flake8は79文字に規定されていますので、Flake8の方を88文字にするために[max-line-length = 88]を入れてあげます。

  • 除外するべきFlake8のエラーコード <E203>

E203は、「:(コロン)」の前後にスペースに関するエラーです。PEP8では通常、コロンの前後のスペースは不要としているものの、「スライス」と呼ばれる書き方がされている場合、Blackはコロンを二項演算子のように扱い、前後に同じ数だけのスペースを入れことがあるそうです。Flake8はこれをエラーとして扱うため、除外する必要があるとのこと。エラーコードの除外方法は[extend-ignore = E203]です。
参考)https://pep8-ja.readthedocs.io/ja/latest/#id16(コロン前後のスペース)

  • Flake8の除外を検討した方が良い他のエラーコード

ところで、除外するべきエラーは引用文ではE203のみとされていますが、Blackの公式ドキュメントを読んでみると、他にも入れることを検討した方が良いものもあるようです。

W503:
二項演算子(+, -など)の前の改行に関するエラー。
Blackは二項演算子の「後」に改行をするが、Flake8は「前」での改行を求める。Blackの設定の方が一般的であるため、無視する。

E701:
1行に複数の文が含まれることを指摘するエラー。Blackはクラスや関数の実装を1行にまとめる場合があるが、Flake8はそれに対し、警告を出すため。

E702:
def関数を使う際に1行に複数の式があることを指摘するエラー。
Blackは複数の式を1行にまとめてしまうことがある。Flake8はデフォルトでこのE704のエラーを無効化しているが、もし有効になっていてE704のエラーが発生するようならignoreに入れる。

参考)
Black 25.1.0 ドキュメント|pycodestyl
Black 25.1.0 ドキュメント|flake8

それではきりが良いので、今回はこちらで終了です。お付き合いいただきありがとうございました。
実践試験について知りたい方は以下をご覧ください。

●Python3エンジニア認定実践試験

PAGE TOP