[python] 자동 코드 포매팅 환경 구축하기

김동욱·2023년 12월 28일

python

목록 보기
1/6
post-thumbnail

협업을 하다가 서로 다른 스타일의 코드를 작성하는 부분이 조금 신경쓰였던 적이 있다. python에서는 코드 포매팅을 위한 여러가지 패키지가 존재한다. 이를 활용하여 일관성 있는 코드를 작성하기 위한 환경 구축에 대해 살펴보자.

(참고로 Django 프로젝트에 맞게 세팅을 했다. 다른 python 프레임워크나 환경을 사용하기 위해선 해당 환경에 맞게 세팅을 해야한다.)

pre-commit 패키지 설치

먼저, pre-commit을 설치해야 한다. pip 명령어를 사용하여 설치할 수 있다.

pre-commit이란 말그대로 커밋하기 전에 수행하고 싶은 hook을 작성하고 등록하는 것을 돕는 패키지이다. 해당 패키지를 사용하여 hook을 등록하므로써 커밋 이전에 코드 포매팅을 진행할 수 있다.

pip install pre-commit

pre-commit-config.yaml 파일 생성 및 설정

프로젝트 루트 디렉토리에서 .pre-commit-config.yaml 파일을 생성하고, 필요한 훅을 정의한다. 이 파일은 pre-commit이 실행할 검사들을 정의한다.

예시로 작성한 .pre-commit-config.yaml 파일 내용은 다음과 같다.

# See https://pre-commit.com for more information
# See https://pre-commit.com/hooks.html for more hooks
repos:
  - repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v4.5.0
    hooks:
      - id: trailing-whitespace
      - id: end-of-file-fixer
      - id: check-yaml
      - id: check-added-large-files

  - repo: https://github.com/pre-commit/mirrors-mypy
    rev: 'v1.7.0'
    hooks:
      - id: mypy
        additional_dependencies: ['django-stubs']

  - repo: https://github.com/psf/black
    rev: 24.2.0
    hooks:
      - id: black
        exclude: .*/migrations/.*|.*urls\.py

  - repo: https://github.com/pycqa/isort
    rev: 5.13.2
    hooks:
      - id: isort
        exclude: .*/migrations/.*

  - repo: https://github.com/pycqa/flake8
    rev: 7.0.0
    hooks:
      - id: flake8
        args: ['--max-line-length=120', '--ignore=F403,F405,F841']
        exclude: .*/migrations/.*

default_language_version:
  python: python3.9

위 설정 파일의 훅들의 역할은 다음과 같다.

  • trailing-whitespace: 파일 끝의 불필요한 공백을 제거
  • end-of-file-fixer: 파일 끝에 개행 문자를 보장
  • check-yaml: YAML 파일의 문법 오류를 검사
  • check-added-large-files: 커밋에 너무 큰 파일이 포함되어 있는지 검사
  • mypy: Python 코드에 대한 정적 타입 검사를 수행
  • black: Python 코드를 자동으로 포맷팅
  • isort: Python의 import 문을 정렬 및 불필요하거나 중복되는 import 문 제거
  • flake8: PEP 8 가이드에 따라 Python 코드의 스타일, 복잡성, 구문 오류를 검사

세부 설정을 .pre-commit-config.yaml 파일에 포함해도 되지만, pyproject.toml과 같은 파일에 분리를 해도 된다. pyproject.toml 파일의 위치도 루트 디렉토리 바로 아래에 위치해야 한다.

아래와 같이 pyproject.toml 파일을 구성하여 검사할 내용의 상세한 부분까지 지정할 수 있다.

[tool.black]
line-length = 120
target-version = ["py39"]

[tool.isort]
profile = "black"
skip = ["__init__.py", "migrations/*"]
multi_line_output = 3
include_trailing_comma = true

[tool.mypy]
python_version = "3.9"
ignore_missing_imports = true

pre-commit 훅 설치

.pre-commit-config.yaml 파일을 작성한 후, pre-commit 훅을 git 훅으로 설정해야 한다(git은 설치가 돼있다고 가정하고 진행). 이를 위해 다음 명령어를 실행한다.

pre-commit install

이 명령어는 pre-commit 훅을 git의 pre-commit 훅으로 등록한다. 이제 커밋을 시도할 때마다 .pre-commit-config.yaml에 정의된 검사가 자동으로 실행된다.

다음은 추가적인 pre-commit 명령어이다.

pre-commit clean(pre-commit에 의해 생성된 캐시를 삭제하는 데 사용. 설정 파일 변경 시 clean -> install)
pre-commit autoupdate(훅들을 최신 버전으로 업데이트)

테스트 및 사용

위 설정을 모두 진행했으면 커밋 시 자동으로 검사가 진행되고 파일이 수정될 것이다. 만약 검사에 실패한다면 수정 후 다시 커밋을 진행하면 된다. 커밋하기 전에 모든 훅을 수동으로 실행하고 싶다면, 다음 명령어를 사용할 수 있다.

pre-commit run --all-files

이 명령어는 모든 파일에 대해 설정된 모든 pre-commit 훅을 실행한다. 참고로 명령어를 실행하는 위치는 장고 프로젝트 루트 디렉토리여야 한다.






참고 자료
https://medium.com/daangn/%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%9D%84-%EC%B2%98%EC%9D%8C-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EB%8F%99%EB%A3%8C%EC%99%80-%ED%9A%A8%EC%9C%A8%EC%A0%81%EC%9C%BC%EB%A1%9C-%EC%9D%BC%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95-bb52c3a433fa
https://codeburst.io/tool-your-django-project-pre-commit-hooks-e1799d84551f

profile
안녕하세요! 질문과 피드백은 언제든지 환영입니다:)

0개의 댓글