2023년 6월 업데이트
안녕하세요. SQLER의 코난 김대우입니다.
이번 강좌에서는, Python 중급 강좌 - 1. Python 스타일 가이드: 서식(Formatting)과 린팅(Linting)을 진행토록 하겠습니다.
SQLER에서 진행되는 전체 Python / 머신러닝 강좌 목록
코드를 실행하기 위해서는, vscode에서 새로운 파일을 만들고 실행하시면 됩니다.
예를 들어, 1_format.py를 생성하고 코드를 실행합니다.
TL;DR
Python 스타일 가이드와 린팅에 대해 다룹니다. 코드 서식과 일관성, PEP8 규칙, docstring 활용, 타입 힌트를 살펴보고, flake8을 사용한 린팅과 autopep8 - 자동 린팅에 대해 리뷰합니다. 린팅을 활용하면 코드 가독성과 팀원간 협업을 증대시키며, 코드 품질을 높일 수 있습니다.
Python 중급 강좌 - 1. Python 스타일 가이드: 서식(Formatting)과 린팅(Linting)
중급 강좌를 시작합니다. 이 중급 강좌는 먼저 위의 강좌 목록을 참고해 초급강좌를 마무리하시고 보시는 것도 한 방법입니다.
하지만, 이 중급강좌는 연속성보다는 주제 단위로 진행됩니다. 관심 있는 강좌만 따로 보는 것도 아무 문제없습니다.
그럼, 첫 강좌, Python 스타일 가이드: 서식(Formatting)과 린팅(Linting) 시작합니다.
서식(Formatting)이란 무엇이고 왜 중요한가?
아래의 코드들은 모두 "적합한(valid)" Python 코드입니다. 하지만 좋지 않은 코드 패턴입니다.
x = 12 if x== 24: print('Is valid') else: print("Not valid") def helper(name='sample'): pass def another( name = 'sample' ): pass
일관성 없는 공백 사용이나 빈 줄 사용, 부적절한 인덴트(들여 쓰기), 따옴표 처리 등의 여러 이슈가 보입니다.
가장 큰 문제는 이런 코딩 패턴이 코드를 읽기 어렵게 만들고, 협업하는 동료 개발자나 다른 개발자에게 어려움을 주는 것이 이슈입니다. 이런 여러 이유로 코드 포맷팅(formatting)이 중요해집니다.
포맷팅이 중요한 이유
- 코드를 읽기 쉽게 만든다.
- 디버깅이 쉬워진다.
- 일관적인 코드는 모두에게 혜택을 준다.
Python 코드 서식 제안 - PEP8
Python은 이러한 코드 포맷팅을 위해 PEP8 규격을 제안하고 있습니다.
PEP 8 -- Style Guide for Python Code | Python.org
내용이 딱딱한 제안문서라 보기 어려운데요, 권장하는 코드 스타일 가이드 내용 링크로 아래의 "The Hitchhiker's Guide to Python" 번역 내용을 강력 권장해 드립니다.
코드 스타일 — The Hitchhiker's Guide to Python (python-guide-kr.readthedocs.io)
특히, 변수명, 함수명, 클래스명, 오브젝트명 naming 부분을 주의 깊게 살펴보고 naming convention을 잘 활용하시길 권장해 드립니다.
docstring을 이용해 함수와 같은 코드에 주석을 추가
함수와 같은 코드상에서 정보를 제공해야 할 경우 등, 주석이 한 줄 이상이면 이렇게 일반적으로 docstring을 이용 가능합니다.
PEP 257 -- Docstring Conventions | Python.org
def print_hello(name: str) -> str: """ 이름으로 사용자 환영 parameter: name (str): 사용자의 이름 return: str: 환영 메시지 """ print('Hello, ' + name)
Type 힌트
type 힌트(hint)를 이용해 vscode와 같은 개발도구나 linter에게 입력값을 선언해 체크토록 한다.
def get_greeting(name: str) -> str: return 'Hello, ' + name
위와 같이 type 힌트를 사용해 name 파라미터가 문자열을 받는 것을 선언할 수 있다. 예를 들어, vscode의 경우 이 함수를 호출하는 인자값을 체크해 문자열이 아닐 경우 자동으로 lint 오류를 출력한다.
권장하는 Linting 도구 - flake8
pylint를 권장하기도 하지만, 최근 많이 사용되는 linting 도구로 "flake8"을 추천해 드립니다.
빠르게 성장하고 있으며, 다양한 자동화 기능과 리포팅 기능으로, 여러 CI 서비스와 연계성도 뛰어나고, 리포트를 XML 등으로 출력해 CI 서비스에서 결과 확인도 가능합니다.
실행 방법은 다음처럼 진행 가능합니다.
# anaconda prompt나 bash shell에서 실행 pip install flake8 # 실행명령 - linting 할 디렉토리에서 flake8 .
code의 한 라인이 너무 길 경우 발생하는 E501오류는 프로젝트 시작 시 팀원 간 협의에 따라 skip 할 수 있습니다.
이 설정을 위해 repo의 최상위 디렉토리에 ".flake8" 파일을 생성하고 아래처럼 입력합니다.
[flake8] ignore = E222
그러면, E222 오류가 skip 되고 linting에서 출력하지 않습니다.
flake8으로 XML report를 출력할 경우 다음과 같은 명령을 쓸 수 있습니다.
# flake8_formatter_junit_xml 추가 설치 pip install flake8_formatter_junit_xml # report를 출력할 경우 실행명령 - 주로 CI/CD pipeline에서 설정해 사용합니다. flake8 --output-file=lint-testresults.xml --format junit-xml
예를 들어, Azure DevOps에서 이런 식으로 pipeline에서 flake8을 설정할 수 있습니다.
Customize Python for Azure Pipelines
자동 Lint 코드 변환툴, autopep8 - 하지만, 만능은 아니다.
autopep8을 이용하면, 코드를 자동으로 변환한다. - autopep8 · PyPI
검토 목적으로 하는 것을 권장하고, 머신러닝, 특히 deep learning 코드를 autopep8이 부적절한 패턴으로 인지하고 변경하는 경우도 있으니 머신러닝 코드에서는 더욱 주의해서 사용하세요. 주로 linting 되지 않은 다량의 외부 코드를 프로젝트에 추가할 때 사용. 다음처럼 설치하고 실행할 수 있습니다.
# autopep8 설치 pip install autopep8 # autopep8 실행 - with aggressive level 2단계 autopep8 --in-place --aggressive --aggressive <filename>
모든 것은 사람의 문제 - Linting을 CI/CI 자동화 루틴에 넣으세요.
Linting을 적용하기 어려운 이유는 사람에 대한 것이기 때문입니다. 옆의 동료 개발자가 제대로 Linting을 하지 않았을 때 가이드하는 것이 "지적질"로 보일 수도 있기 때문이죠.(개발 문화 이야기는 나중에...)
가장 좋은 방법은 모든 개발자가 개발도구(vscode) 등에서 자동 linting 설정을 켜서 항상 체크하는 것이고, 코드를 commit 하기 전에 항상 flake8 등으로 linting 검사를 하는 것입니다.
프로젝트에서 강제하기 위해서는 프로젝트 repository의 주요 develop branch에 code quality check 정책을 넣어서, code PR이 올라오면, 항상 이러한 policy가 동작하게 구성하는 것이 프로젝트와 팀원 모두를 위한 최선의 방안입니다. (unit test도 함께 이렇게 자동화시켜 실행하는 것이 좋습니다. - 추후 강좌 진행 예정)
vscode 자동 linting 기능 설정
vscode에서 "컨트롤+쉬프트+p"를 누르면 이렇게 인터렉티브 창이 뜨고, "Python: Select Linter"를 선택하고 flake8이나 선호하는 linter를 선택/설치합니다. 이어서 "Python: Enable Linting"을 on으로 설정하면 자동으로 litning을 실행하게 됩니다.
다음 강좌에서 뵙겠습니다.
파이썬 강좌 책 구매
강좌가 도움이 되셨다면, 책으로 구매 가능합니다. 책 판매 수익금은 전액 코딩 교육 사회공헌 활동에 기부되며, 아래 링크에서 구매하시면 더 많은 금액이 기부됩니다.
책구매 링크: 챗GPT와 함께하는 파이썬 & 머신러닝 코딩 마스터
참고링크
개발자 커뮤니티 SQLER.com - Python 무료 강좌 - 기초, 중급, 머신러닝
Build and test Python apps - Azure Pipelines | Microsoft Docs