본문 바로가기

프로그래밍/Python

Python Code Formatter Black 적용기

    왜 하게 됬는가?

    배정된 업무인 프로젝트를 진행하면서, 기존에 혼자 개발하고 있었는데 갑자기 프로젝트에 새로 합류한 팀원이 생기면서, 각자 코딩 스타일이 다르고 이러한 부분들에 대해 서로 맞춰야한다는 필요성을 느꼈습니다.

    • 강제로 맞추기 위해 예전부터 생각해오던 Formatter를 적용하기로 했습니다.
    • 기존에 로컬에서 혼자 진행할때는 pylint를 사용했었는데 pylint는 style checker로써의 역할밖에 되지 않았다.
      • (code) style checker?
        • 예시 기능 - 탭은 space4개, string은 ''가아닌 ""로 해야한다는 오류사항을 알려줌 (코드 변환을 안해줌)
      • formatter?
        • 예시 기능 - import module중 안쓰는게 있으면 삭제해줌. (코드가 변환됨)
    • 여러명이 함께 프로젝트를 진행할때는 Formatter의 기능이 필요했고, 이를 위해 자료조사를 시작.

    왜 Black인가?

    여러가지 Formatter가 선택 목록에 있었고, 아래는 고민했던 몇가지 Formatter 목록입니다.

    각 Formatter들의 특징 및 장단점.

    1. Black (21k stars)
      1. 파이썬 Core개발자가 만듬
      2. 별도 설정없이 알아서 Formatting을 제일 공통적, 효율적, 대중적인 것을 선택함.(스타일을 어떻게 갈까요를 고민하는 시간 비용이 0)
      3. Javascript의 prettier 철학을 따라 만들어졌다고 함.
      4. https://github.com/psf/black
    2. Autopep8 (3.8k stars)
      1. pycodestyle(code style checker) 기반인 Formatter
      2. 여러 개발자가 참여. 오픈소스. 가장 오래된 Formatter
      3. hhatto/autopep8
    3. yapf (11.7k stars)
      1. 구글에서 만든 Formatter
      2. google/yapf

     

    Trend history

    formatter 비교 그래프

    https://star-history.t9t.io/#psf/black&google/yapf&hhatto/autopep8

     

    Star history

    Clear the result Share the result Export as CSV

    star-history.t9t.io


    적용 방법

    $ pip install black
    $ black --check main.py

    그런데 이렇게하면 일일히 다해줘야되서 번거롭다.

    그럴때는 아래와 같이 사용합니다.

    • 현재 경로의 모든 하위 폴더의 py파일을 검사하는 방법
    $ black "$PWD"

     

    그 외에 고려해볼 사항

    위에 내용을 통해 Formatter를 선택하고 사용 방법을 알게 됬지만, 이렇게 하겠다하는 것을 사람들끼리 대화로 공유하지 않아서 코드가 엉망이되거나, 내용이 공유가 됬어도 실수로 적용하지 않는 경우가 발생하는데 이러한 문제들을 방지하기 위해 git hook을 적용하였습니다.

    1. git hook(pre-commit)
      1. 코드 커밋시 hook을 통해 특정 행동 처리를 강제합니다.
      2. 특정 행동 : black을 사용해서 formatting하는 작업


    사용법

    $ pip install pre-commit

     

    pre-commit을 위한 셋팅 파일 생성

    .pre-commit-config.yaml

    repos:
      - repo: https://github.com/psf/black
        rev: stable
        hooks:
          - id: black

    설정된 파일을 기반으로 pre-commit 기능을 git에 설치합니다.(아래 커맨드 실행 시 git설정 파일을 변경시키는듯)

    $ pre-commit install

     

    추가로 편리하게 쓸수있도록 Intellij의 경우 특정 커맨드입력시 black을 한번 실행해주는데 이 부분은 따로 정리하지는 않았습니다.

     

     

     

    참고자료

    https://black.readthedocs.io/en/stable/

     

    The uncompromising code formatter — Black 21.6b0 documentation

    The uncompromising code formatter By using Black, you agree to cede control over minutiae of hand-formatting. In return, Black gives you speed, determinism, and freedom from pycodestyle nagging about formatting. You will save time and mental energy for mor

    black.readthedocs.io

    https://jonnung.dev/python/2019/11/10/python-black-uncompromising-code-formatter/

     

    조은우 개발 블로그

     

    jonnung.dev

    https://www.daleseo.com/pre-commit/

     

    pre-commit 도구로 Git Hook 사용하기

    Engineering Blog by Dale Seo

    www.daleseo.com