왜 필요?


똑같은 실행을 하는 코드여도 남이 짠 코드는 잘 안 읽힌다.

모두가 각자 나름의 규칙을 지켜서 최대한 깔끔하게 작성했겠지만 그 규칙이 남에게도 적용되기란 쉽지 않다.

이때, 각자가 최소한 정해진 규칙대로 코드를 작성하려고 노력하면 이해하는데 조금이나마 도움이 될 수 있다.

언어마다 각각의 코드 작성 규칙이 있는데 이를 스타일 가이드 또는 컨벤션이라고 한다. 

파이썬에도 PEP8이라는 스타일 가이드가 있다. 

 

PEP 8 – Style Guide for Python Code | peps.python.org

PEP 8 – Style Guide for Python Code Author Guido van Rossum , Barry Warsaw , Nick Coghlan Status Active Type Process Created 05-Jul-2001 Post-History 05-Jul-2001, 01-Aug-2013 Table of Contents This document gives coding conventions for the Python code co

peps.python.org

위 링크엔 PEP8의 규칙들이 적혀 있는데, 들어가 보면 알겠지만 솔직히 가이드 내용이 엄청 많진 않다.

그래서 만약 처음 파이썬을 사용할 때 부터 가이드를 준수하여 코드를 작성 한다면, 코드 스타일과 관련된 고민도 필요 없을 것이다. 하지만 사람이 기계도 아니고, 그러긴 쉽지 않다. 

 

혹시 가이드를 따를 의지는 있지만 매번 확인하긴 귀찮다면, 작성한 코드를 PEP8 스타일로 변경할 수 있는 기능을 활용하면 된다. 이처럼 코드를 원하는 스타일로 변경해주는 역할을 하는 것이 바로 LinterFormatter이다. 둘은 비슷하면서도, 조금 다른 역할을 수행한다.

 

우선 Formatter는 문자 그대로 코드 스타일 관리에만 집중하는 툴이다. 반면 Linter는 코드 스타일 관리 뿐 아니라, 전반적인 코드 품질 전체를 관리한다. 

 

Linter


Linter는 PEP8 가이드를 따르는 지, 불러오고 사용하지 않는 package가 있지는 않은지 등등 다양한 오류 및 버그 수정을 도와준다. 자동 수정을 지원하는 Linter도 있지만, 일반적으로 에러 메시지를 띄워 사용자에게 알려주는 역할을 수행한다. Linter를 사용하면 코드에 잠재하고 있는 문제를 미리 파악하고 대처할 수 있게 된다.

 

Linter를 별도로 설치해서 사용할 수도 있지만, vscode를 통해서도 활용할 수 있다.

Ctrl + shift + P를 누른 뒤에 나오는 Python : Select Linter를 통해 사용하고 싶은 Linter를 고를 수가 있다.

 

다음은 Python Linter 중 하나인 flake8의 실행 결과이다.

$ flake8 ./parse.py
./parse.py:2:1: F401 'logging' imported but unused
./parse.py:3:1: E302 expected 2 blank lines, found 0
./parse.py:3:15: F821 undefined name 'ScrapyCommand'
./parse.py:6:5: E303 too many blank lines (2)
./parse.py:7:24: W291 trailing whitespace
./parse.py:8:15: E221 multiple spaces before operator
./parse.py:9:18: E701 multiple statements on one line (colon)
./parse.py:10:13: E701 multiple statements on one line (colon)
./parse.py:15:1: W391 blank line at end of file

결과를 보면 logging이 import 됐지만 실행되지 않은 점이 확인 됐고, 공백이 너무 많거나 없는 경우도 확인 됐다. 물론 지금 당장은 문제 되지 않는 부분이지만, 앞으로 혹시 모를 문제가 생길 수 있는 부분이다. 이처럼 Linter는 사용자에게 경고 메시지를 남겨, 문제를 미리 파악하고 대처할 수 있도록 도와준다.

 

Linter의 설정을 일부 변경하면, 상황에 맞게 활용할 수도 있다. flake8의 경우 .flake8 파일에 설정 값들을 입력해주면 된다. 실제로 아래 코드는 flake8과 black이라는 formatter를 같이 사용할 때를 기준으로 작성된 설정 값 들이다.

[flake8]
select = ANN,B,B9,BLK,C,D,E,F,I,S,W
  # only check selected error codes
max-complexity = 12
  # C9 - flake8 McCabe Complexity checker -- threshold
max-line-length = 120
  # E501 - flake8 -- line length too long, actually handled by black
extend-ignore =
  # E W - flake8 PEP style check
    E203,E402,E501,W503,  # whitespace, import, line length, binary operator line breaks
  # S - flake8-bandit safety check
    S101,S311,S105,  # assert removed in bytecode, pRNG not secure, hardcoded password
  # ANN - flake8-annotations type annotation check
    ANN,ANN002,ANN003,ANN101,ANN102,ANN202,  # ignore all for now, but always ignore some
  # D1 - flake8-docstrings docstring style check
    D100,D102,D103,D104,D105,  # missing docstrings
  # D2 D4 - flake8-docstrings docstring style check
    D200,D205,D400,D401,  # whitespace issues and first line content
  # DAR - flake8-darglint docstring correctness check
    DAR103,  # mismatched or missing type in docstring
  • select : 어떤 종류의 에러를 처리할 지 설정
  • extend-ignore : 제외할 에러 설정

위 코드에선 style과 관련된 에러들이 많이 제외된 것을 확인할 수 있는데, formatter를 함께 사용하는 상황이기에 불 필요한 반복을 줄이기 위해서 제거한 것으로 생각하면 된다.

 

이처럼 flake8은 사용 환경에 따라 다양한 설정을 추가하여 자유롭게 활용할 수 있다. 설정과 관련된 자세한 사항은 링크를 통해 확인할 수 있다. 

 

Formatter


Formatter는 문자 그대로, PEP8 스타일 가이드를 따르도록 코드를 수정해준다. 실제로 Formatter를 동작시키면 아래와 같이 자동으로 스타일 가이드를 따르도록 코드를 변경해준다.

https://wingware.com/hints/reformatting

Formatter 또한 vscode에서 쉽게 활용할 수 있다.

Shift + Alt + F 만 누르면 문서에 Formatter를 적용할 수 있다.

만약 없으면 가장 자리에 설치하라고 나오니 원하는 Formatter를 고르면 된다.

 

현재 Python에서 활용되는 Formatter는 autopep8, black, yapf 등이 있다. 이때, Star history 추세상

black을 먼저 사용해보는 것이 좋은 선택지가 될 것이다.

https://star-history.com/

 

GitHub - psf/black: The uncompromising Python code formatter

The uncompromising Python code formatter. Contribute to psf/black development by creating an account on GitHub.

github.com

 

Testing, Linting 자동화


Testing과 Linting 과정을 자동화하면 효과적으로 코드를 관리할 수 있다. 특히 Git과 같은 VCS(Version Control System)에 해당 기능을 통합시켜 자동화하면, 버전 정보를 통해 에러를 재현하고 이해하는데 큰 도움이 된다. 또한 추가로 Testing - Linting 과정 중 다른 개발을 진행할 수 있다는 장점이 있다.

만약 버전 히스토리를 깔끔하게 관리하고 싶다면 VCS에 통합 전 pre-commit 기능을 활용해 로컬 환경에서 Testing과 Linting을 진행하면 된다.

이러한 자동화는 소프트웨어의 품질과 일관성을 보장하여 프로젝트의 성공에 기여할 수 있지만 사용 툴 - 기술에 대한 높은 이해도가 필요하다. 잘못된 자동화는 오히려 역효과를 내기 때문이다. 이처럼 자동화는 중요하지만, 어렵기에 경험이 많은 사람에게 조언을 구하는 것이 큰 도움이 된다고 한다.