나는 이렇게 학습한다/Library

pre-commit 에서 ‘flake8’ 과 ‘black’ 커스텀 문제

daco2020 2022. 4. 7. 19:10
반응형

예제 코드

# setup.cfg

[flake8]
exclude = .git
max-line-length = 88

[black]
line-length = 88

 

flake8 과 black 에 ‘line-length’설정 값이 중복되는 것이 아니냐는 의견이 있었습니다.

 

우선 결론부터 말씀드리자면 둘다 있어야 한다고 생각합니다.

 

그 이유는 어느 한쪽을 생략한 경우,

생략한 쪽은 기본값을 채택하여 개발자가 원하는대로 작동하지 않기 때문입니다.

 

 

 

예를들어 위에 문서에서 flake8의 ‘max-line-length = 88’ 를 생략하는 경우

# 코드 수정

[flake8]
exclude = .git
# max-line-length = 88

 

black은 88자를 통과시키지만 flake8은 기본값인 79자를 기준으로 검사합니다.

# 결과

black....................................................................Passed
flake8...................................................................Failed
- hook id: flake8
- exit code: 1

ap-toy/main.py:9:80: E501 line too long (223 > 79 characters)

isort....................................................................Passed
pyright..................................................................Passed

 

 

반대로 black 의 line-length을 생략하는 경우, pre-commit 과정에서 코드가 수정되지 않습니다.

 

 

 

추가로 발견한 문제

사실 위의 setup.cfg파일에는 문제가 있었습니다.

테스트를 위해 black의 line-length 값을 극단적으로 줄였는데 아무런 문제없이 통과되었습니다.

# 코드 수정

[black]
line-length = 10
# 결과

black....................................................................Passed
flake8...................................................................Failed
- hook id: flake8
- exit code: 1

ap-toy/main.py:9:89: E501 line too long (223 > 88 characters)

isort....................................................................Passed
pyright..................................................................Passed

black의 설정 값이 정상반영되지 않았습니다.

 

이를 해결하기 위해 pyproject.toml 파일에 black 설정을 추가하니 정상 반영되었습니다.

# pyproject.toml

[tool.black]
line-length = 88
# 결과

black....................................................................Failed
- hook id: black
- files were modified by this hook

reformatted run-server.py
reformatted ap-toy/main.py
reformatted commit-msg.py

All done! ✨ 🍰 ✨
3 files reformatted, 1 file left unchanged.

flake8...................................................................Failed
- hook id: flake8
- exit code: 1

ap-toy/main.py:15:89: E501 line too long (223 > 88 characters)

isort....................................................................Failed
- hook id: isort
- files were modified by this hook

Fixing /Users/daco/alphaprime/portfolio-toy-project-uckim/ap-toy/main.py
# isort Failed 는 black이 import문을 수정하여 생긴 에러로 보입니다.

pyright..................................................................Passed

때문에 black은 ‘pyproject.toml’ , flake8은 ‘setup.cfg’ 파일로 분리하였고 정상 작동하는 것을 확인하였습니다.

 

 

 

레퍼런스

 

How to setup your project with pre-commit, black, and flake8

Why pre-commit Git hooks? Several OpenStax Python projects use Git hooks via pre-commit in...

dev.to

 

반응형