【python, pre-commit】isortで修正された部分がBlackでも修正されちゃうのだが

commitしてくれるときにpre-commitを使えばで自動でリンタやフォーマティングしてくれるの便利ですよね。

ただ、タイトルにもあるように一方のルールで修正された部分が他のルールで修正されて永遠にpre-commitがパスできないときがあります。

例えば以下のようなコードを考えます。

from a import x_func
from a import y_func
from a import z_func

これはisortを利用すると、大体以下のようにフォーマティングされます。

from a import (x_func, y_func
               z_func)

これをさらにBlackでフォーマティングすると、以下のようにフォーマティングされます。

from a import x_func, y_func, z_func

pre-commit.yaml

上記の問題が発生するpre-commit.yamlファイルを下に載せました。

black, sort以外のrepoは今回の問題に関係ないので無視していただいてOKです。

repos:
-   repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v4.3.0
    hooks:
    -   id: check-added-large-files
    -   id: check-toml
    -   id: check-yaml
        args:
        -   --unsafe
    -   id: end-of-file-fixer
    -   id: trailing-whitespace
-   repo: https://github.com/asottile/pyupgrade
    rev: v3.1.0
    hooks:
    -   id: pyupgrade
        args:
        - --py311-plus
-   repo: https://github.com/PyCQA/autoflake
    rev: v1.7.7
    hooks:
    -   id: autoflake
        args:
        - --recursive
        - --in-place
        - --remove-all-unused-imports
        - --remove-unused-variables
        - --exclude
        - __init__.py
        - --remove-duplicate-keys
-   repo: https://github.com/pycqa/isort
    rev: 5.10.1
    hooks:
    -   id: isort
        name: isort (python)
    -   id: isort
        name: isort (cython)
        types: [cython]
    -   id: isort
        name: isort (pyi)
        types: [pyi]
-   repo: https://github.com/psf/black
    rev: 22.10.0
    hooks:
    -   id: black

解決方法

結論から言うと、isortのprofileという機能を使えばいいです。これは他のツールと互換性を保てるような設定を自動でしてくれます。使い方はisort –profile blackみたいに、profileのあとに衝突が起きているツール(ここではblack)を設定します。

pre-commitでの設定方法は以下のようになります。注意点としては、args –profile blackのように一行で書くんじゃなくて、- で行を区切らないといけないところです。

-   repo: https://github.com/pycqa/isort
    rev: 5.10.1
    hooks:
    -   id: isort
        args:
        - --profile
        - black
        name: isort (python)
    -   id: isort
        args:
        - --profile
        - black
        name: isort (cython)
        types: [cython]
    -   id: isort
        args:
        - --profile
        - black
        name: isort (pyi)
        types: [pyi]
Copied title and URL