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을 실행하게 됩니다.

vscode_lint.png

 

다음 강좌에서 뵙겠습니다.

 

 

파이썬 강좌 책 구매

강좌가 도움이 되셨다면, 책으로 구매 가능합니다. 책 판매 수익금은 전액 코딩 교육 사회공헌 활동에 기부되며, 아래 링크에서 구매하시면 더 많은 금액이 기부됩니다. 

 

책구매 링크: 챗GPT와 함께하는 파이썬 & 머신러닝 코딩 마스터 

파이썬-책구매링크.png

 

참고링크

개발자 커뮤니티 SQLER.com - Python 무료 강좌 - 기초, 중급, 머신러닝

c9-python-getting-started/more-python-for-beginners/01 - Formatting and linting at master · CloudBreadPaPa/c9-python-getting-started (github.com)

Build and test Python apps - Azure Pipelines | Microsoft Docs

autopep8 · PyPI

No. Subject Author Date Views
Notice SQL강좌: 챗GPT와 함께 배우는 SQL Server 무료 강좌 목차와 소개 (2023년 9월 업데이트) 코난(김대우) 2023.08.18 38111
Notice Python 무료 강좌 - 기초, 중급, 머신러닝(2023년 6월 업데이트) 코난(김대우) 2021.01.01 20672
98 Python 중급 강좌 - 4. 상속(Inheritance) 코난(김대우) 2021.01.03 344
97 Python 중급 강좌 - 3. 클래스(Class) 코난(김대우) 2021.01.03 403
96 Python 중급 강좌 - 2. 람다(Lamda) file 코난(김대우) 2021.01.03 545
» Python 중급 강좌 - 1. Python 스타일 가이드: 서식(Formatting)과 린팅(Linting) file 코난(김대우) 2021.01.02 1098
94 Python 초급 강좌 목차 - 19. 코드에서 중요한 키(패스워드) 관리 - dotenv 코난(김대우) 2021.01.02 964
93 Python 초급 강좌 목차 - 18. 데코레이터(Decorators) 코난(김대우) 2021.01.02 338
92 Python 초급 강좌 목차 - 17. JSON 데이터 처리 file 코난(김대우) 2021.01.02 817
91 Python 초급 강좌 목차 - 16. 외부 웹서비스 API 호출 file 코난(김대우) 2021.01.02 945
90 Python 초급 강좌 목차 - 15. 패키지(Package): import, pip 코난(김대우) 2021.01.02 411
89 Python 초급 강좌 목차 - 14. 함수 파라미터(Parameter) 코난(김대우) 2021.01.02 399
88 Python 초급 강좌 목차 - 13. 함수(Function) 코난(김대우) 2021.01.02 542
87 Python 초급 강좌 목차 - 12. 반복문(Loop): for, while 코난(김대우) 2021.01.02 324
86 Python 초급 강좌 목차 - 11. 컬렉션(Collection): list, array, dictionary file 코난(김대우) 2021.01.02 327
85 Python 초급 강좌 목차 - 10. 조건문(Condition):3 복잡한 조건 처리 코난(김대우) 2021.01.01 358
84 Python 초급 강좌 목차 - 9. 조건문(Condition):2 다중 조건 처리 코난(김대우) 2021.01.01 394
83 Python 초급 강좌 목차 - 8. 조건문(Condition):1 (IF-ELSE) 코난(김대우) 2021.01.01 362
82 Python 초급 강좌 목차 - 7. 에러 핸들링(Error Handling) file 코난(김대우) 2021.01.01 352
81 Python 초급 강좌 목차 - 6. 날짜와 시간 데이터 처리 코난(김대우) 2021.01.01 388
80 Python 초급 강좌 목차 - 5. 숫자(Numeric) 데이터 처리 코난(김대우) 2021.01.01 325
79 Python 초급 강좌 목차 - 4. 문자열(String) 데이터 처리 코난(김대우) 2021.01.01 429





XE Login