안녕하세요. SQLER의 코난 김대우입니다. 

이번 강좌에서는, Python 중급 강좌 - 1. Python 스타일 가이드: 서식(Formatting)과 린팅(Linting)을 진행토록 하겠습니다.

 

SQLER에서 진행되는 전체 Python / 머신러닝 강좌 목록

 

코드를 실행하기 위해서는, vscode에서 새로운 파일을 만들고 실행하시면 됩니다.

예를 들어, 1_format.py를 생성하고 코드를 실행합니다.

 

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 서비스에서 결과 확인도 가능합니다. 

 

실행 방법은 다음처럼 진행 가능합니다.

# bash shell에서 실행
pip install flake8

# 실행명령 - linting할 디렉토리에서
flake8 .

 

code의 한 라인이 너무 길 경우 발생하는 E501오류는 프로젝트 시작시 팀원간 협의에 따라 skip할 수 있습니다.
이 설정을 위해 repo의 최상위 디렉토리에 ".flake8" 파일을 생성하고 아래처럼 입력합니다.

[flake8]
ignore = E501

그러면, E501 오류가 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을 설정할 수 있습니다. 

Build and test Python apps - Azure Pipelines | Microsoft Docs

 

자동 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: Enable Linting"을 on으로 설정하면 자동으로 litning을 실행하게 됩니다.

vscode_lint.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 2023년 1월 - SQLER의 업데이트 강좌 리스트 코난(김대우) 2023.01.02 1291
Notice Python 무료 강좌 - 기초, 중급, 머신러닝(2021년 1월 업데이트) 코난(김대우) 2021.01.01 1167
96 Python 중급 강좌 - 2. 람다(Lamda) file 코난(김대우) 2021.01.03 267
» Python 중급 강좌 - 1. Python 스타일 가이드: 서식(Formatting)과 린팅(Linting) file 코난(김대우) 2021.01.02 491
94 Python 초급 강좌 목차 - 19. 코드에서 중요한 키(패드워드) 관리 - dotenv 코난(김대우) 2021.01.02 499
93 Python 초급 강좌 목차 - 18. 데코레이터(Decorators) 코난(김대우) 2021.01.02 176
92 Python 초급 강좌 목차 - 17. JSON 데이터 처리 file 코난(김대우) 2021.01.02 487
91 Python 초급 강좌 목차 - 16. 외부 웹서비스 API 호출 file 코난(김대우) 2021.01.02 565
90 Python 초급 강좌 목차 - 15. 패키지(Package): import, pip 코난(김대우) 2021.01.02 168
89 Python 초급 강좌 목차 - 14. 함수 파라미터(Parameter) 코난(김대우) 2021.01.02 164
88 Python 초급 강좌 목차 - 13. 함수(Function) 코난(김대우) 2021.01.02 199
87 Python 초급 강좌 목차 - 12. 반복문(Loop): for, while 코난(김대우) 2021.01.02 137
86 Python 초급 강좌 목차 - 11. 컬렉션(Collection): list, array, dictionary file 코난(김대우) 2021.01.02 177
85 Python 초급 강좌 목차 - 10. 조건문(Condition):3 복잡한 조건 처리 코난(김대우) 2021.01.01 153
84 Python 초급 강좌 목차 - 9. 조건문(Condition):2 다중 조건 처리 코난(김대우) 2021.01.01 175
83 Python 초급 강좌 목차 - 8. 조건문(Condition):1 (IF-ELSE) 코난(김대우) 2021.01.01 164
82 Python 초급 강좌 목차 - 7. 에러 핸들링(Error Handling) file 코난(김대우) 2021.01.01 182
81 Python 초급 강좌 목차 - 6. 날짜와 시간 데이터 처리 코난(김대우) 2021.01.01 200
80 Python 초급 강좌 목차 - 5. 숫자(Numeric) 데이터 처리 코난(김대우) 2021.01.01 150
79 Python 초급 강좌 목차 - 4. 문자열(String) 데이터 처리 코난(김대우) 2021.01.01 195
78 Python 초급 강좌 목차 - 3. 주석(Comments) 코난(김대우) 2021.01.01 169
77 Python 초급 강좌 목차 - 2. Print 구문 file 코난(김대우) 2021.01.01 282





XE Login