Published on

커밋 전 Python 코드 lint & format 하는 방법(feat. pre-commit, flake8, black)

Authors

로컬에서 작업한 뒤 커밋할 때 코드를 자동으로 lint, format 해주는 방법에 대해서 알아보겠습니다. Git hook 중에서 pre-commit 은 commit 이 레포지토리에 반영되기 전 단계를 말하는데, 이 때 black 으로 코드 포매팅을하고 flake8 으로 lint 를 하는 로직을 추가할 수 있습니다.

Python pre-commit Framework

pre-commit 이란 파이썬 프레임워크를 활용하면 다음과 같이 이를 간단히 구현할 수 있습니다.

  1. 먼저 pre-commit 을 패키지로 설치해주세요(pip install pre-commit)
  2. pre-commit 을 requirements.txt 에 추가해줍니다.
  3. .pre-commit-config.yml 파일을 생성하여 훅을 정의합니다
  4. pre-commit install 명령으로 정의한 훅을 .git/ 폴더에 설치합니다.

.pre-commit-config.yml 파일은 다음과 같이 설정하면 됩니다.

repos:
  - repo: https://github.com/ambv/black
    rev: stable
    hooks:
      - id: black
        language_version: python3.6
  - repo: https://gitlab.com/pycqa/flake8
    rev: 3.7.9
    hooks:
      - id: flake8

Black Configuration

다음과 같이 프로젝트 루트 디렉터리에 pyproject.toml 파일을 생성하면 black 이 코드 포매팅을 할 때 정의된 규칙을 바탕으로 수행하게 됩니다.

[tool.black]
line-length = 79
include = '\.pyi?$'
exclude = '''
/(
    \.git
  | \.hg
  | \.mypy_cache
  | \.tox
  | \.venv
  | _build
  | buck-out
  | build
  | dist
)/
'''

Flake8 Configuration

마찬가지로 프로젝트 루트 디렉터리에 .flake8 을 추가하면 정의된 규칙을 바탕으로 린트를 하게 됩니다.

[flake8]
ignore = E203, E266, E501, W503, F403, F401
max-line-length = 79
max-complexity = 18
select = B,C,E,F,W,T4,B9

여기서 나열된 알파벳은 lint code 의 이니셜 문자로, 해당 알파벳이 포함된 모든 규칙을 지칭합니다.

그리하여 결과적으로 다음과 같은 git workflow 가 만들어지게 됩니다.

커밋 전 lint & format 이 포함된 Git Workflow
example

References