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]