코딩/python

[파이썬] flake8 & pre-commit 사용법 (+ VS Code)

curious_cat 2023. 7. 28. 00:02
728x90
728x90

개요

  • 코딩을 하다 보면 일상적으로 코드가 더러워지는데, 파이썬 코드 같은 경우 flake8 (코드 컨벤션을 확인해 주는 툴)을 통해서 더러워지는 것을 어느 정도 방지할 수 있습니다.
  • pre-commit을 통해 git commit하기 전에 코드가 flake8에 맞게 작성되어 있는지 확인을 함으로써 git repo도 더욱 깔끔하게 유지할 수 있습니다.

방법

0. git repo 준비

# hello.py 내용
print("hello world")# print a statement

1. 콘다 환경 구축

  • conda create --name flake8 python==3.9.12 실행

2. flake8 설치

  • pip install flake8 실행
  • 저는 6.0.0 버전이 설치가 되었습니다.
  • 어떻게 생각하면 당연하지만, 실제로 사용할 파이썬 버전에 flake8을 설치해야하기 때문에 주의가 필요합니다. 예를 들어 파이썬 3.5를 사용할 것이면 파이썬 버전이 3.5인 환경에서 flake8을 설치해야 파이썬 3.5 버전에 맞게 flake8이 작동합니다 (참고 자료)

3. Visual Studio Code에 flake8 extension 추가 (optional)

  • 저는 보통 VS Code로 코딩을 하기 때문에 Flake8 extension을 같이 사용합니다.

Flake8을 install해준다

  • Flake8 extension을 추가하면 VS Code에서 syntax/style에 문제가 있는지 확인을 합니다. 현제 hello.py 파일에서 flake8 스타일과 충돌하는 부분이 2개 뜨는데, inline comment 시작하기 전에 space가 없는 것과 (밑에 사진에서 볼 수 있는 flake8에서 error, E261), end of file에서 newline이 없는 에러 (flake8에서 warning, W292)이 뜹니다.

  • flake8에서 준수해야하는 다양한 룰들은 여기서 확인 가능합니다.

4. .flake8 파일 생성 (설정 파일)

  • flake8으로 체크하기 싫은 파일, 또는  무시하고 싶은  warning/error들은 .flake8 파일을 통해서 설정할 수 있습니다 (밑에 간단한 예시 참고).
  • 보통 .flake8 파일은 [flake8]로 시작합니다.
  • exclude를 통해서 무시하고 싶은 파일 설정. 예를 들어 .git, .gitignore, __pycache__를 무시하려면 다음과 같이 exclude 하는 리스트에 추가하면 됩니다.
  • 무시하고 싶은 error/warning은 ignore에 추가하면 됩니다. 예를 들어서 E261을 ignore 리스트에 추가하면 더 이상 inline comment 앞에 space가 없다고 귀찮게 하지 않습니다.
  • 코드에서 single line코드 길이가 너무 길어지는 것을 방지하고 싶으면 max-line-length를 설정하면 됩니다. 저는 120으로 설정해뒀습니다 (PEP8에서는 79를 권장하니 참고)
# .flake8 파일 내용
[flake8]
exclude =
    .git,
    .gitignore,
    **/__pycache__,

ignore = E231,
    E226,
    F401,
    E722,

max-line-length = 120

5. pre-commit 설치

  • pip install pre-commit 실행
  • 저는 3.3.3 버전이 설치되었습니다

6. .pre-commit-config.yaml 파일 생성 (설정 파일)

  • .pre-commit-config.yaml 파일은 pre-commit 설정을 해주는 파일입니다 (밑에 예시 참고)
  • repos: pre-commit에 사용할 git repo들의 리스트입니다
  • repo: git clone할 repository 링크입니다. 예를 들어서 pre-commit-hook 레포를 사용하고 싶으면 https://github.com/pre-commit/pre-commit-hook를 추가하고, flake8 레포를 사용하고 싶으면 https://github.com/pycqa/flake8를 추가합니다.
  • rev: git repository에서 사용할 tag/version 입니다. pre-commit-hook 레포 같은 경우 v4.4.0이 최신이라서 저는 이 버전으로 세팅했습니다. flake8 같은 경우 파이썬 환경에서 설치한 버전이 6.0.0이라서 6.0.0으로 세팅하였습니다.

  • hooks: 사용할 훅. pre-commit-hook 중 trailing-whitespace 같은 경우 trailing white space가 없는지 확인해줍니다. 다양한 pre-commit 훅들은 여기서 확인 가능합니다. flake8같은 경우 flake8 훅을 사용하면 됩니다.
  • 추가적인 pre-commit 정보는 여기 참고. pre-commit에 flake8 사용 정보는 여기 참고.
repos:
-   repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v4.4.0
    hooks:
    -   id: trailing-whitespace
    -   id: check-yaml
    -   id: check-json
-   repo: https://github.com/pycqa/flake8
    rev: 6.0.0
    hooks:
    -   id: flake8

7. pre-commit에 필요한 git-hook 파일 설치

  • pre-commit install 실행

8. 잘 작동하는지 확인

git add hello.py
git commit -m "test commit"
  • 이 코드를 실행하면 다음과 같은 메시지가 뜹니다

  • pre-commit-hook 같은 경우 hello.py에 trailing whitespace가 없어서 passed가 뜨고, tracking 하고 있는 yaml, json 파일이 없어서 skipped가 뜹니다
  • flake8 같은 경우 예상대로 E261과 W292 때문에 failed가 뜹니다. 
  • 다음과 같이 E261, W292 문제가 없도록 수정해주면 문제없이 commit이 가능합니다

728x90
728x90

'코딩 > python' 카테고리의 다른 글

PYTHONPATH 환경 변수  (0) 2023.01.23