Python 코드 스타일 및 린팅 모범 사례
Olivia Novak
Dev Intern · Leapcell

Python 코드 스타일 및 검사 도구 가이드
Python 코드 스타일 가이드는 확정된 것이 아닙니다. 언어의 발전과 함께 지속적으로 진화합니다. 일부 오래된 규칙은 점차 단계적으로 폐지되고 새로운 규칙이 계속 등장합니다. 동시에 많은 프로젝트에는 자체 코딩 스타일 가이드가 있습니다. 충돌이 발생하면 프로젝트별 가이드를 먼저 따라야 합니다. 그러나 명심해야 할 중요한 원칙이 있습니다. "일관성에 대한 어리석은 고집은 무지의 괴물이다"라는 Guido의 심오한 통찰력입니다. 코드는 작성하는 것보다 읽는 빈도가 더 높기 때문에 스타일 가이드의 핵심 목표는 코드 가독성을 향상시키고 모든 종류의 Python 코드를 일관성 있게 유지하는 것입니다. PEP20에서 "가독성이 중요하다"고 말합니다.
스타일 가이드는 일관성을 강조합니다. 가이드를 따르는 것도 중요하지만 프로젝트 내의 일관성은 훨씬 더 중요하며 모듈 또는 기능 내의 일관성이 가장 중요합니다. 물론 스타일 가이드의 일부를 무시할 수 있는 합리적인 상황도 있습니다. 예를 들어 가이드를 적용하면 코드 가독성이 저하됩니다. 주변의 이전 코드와 일관성을 유지하면 전체 구조가 손상됩니다. 코드가 가이드보다 먼저 나타났고 수정할 필요가 없습니다. 코드가 이전 버전의 Python 기능과 호환되어야 하는 경우 등입니다. 특히 PEP를 따르기 위해 이전 버전과의 호환성을 깨지 않도록 주의해야 합니다!
코드 레이아웃
들여쓰기
- 각 들여쓰기 수준에 대해 4개의 공백을 균일하게 사용합니다.
- 괄호 안에서 수직 암시적 들여쓰기 또는 매달린 들여쓰기를 사용할 수 있습니다. 매달린 들여쓰기를 사용할 때 첫 번째 줄에는 매개변수가 포함되어서는 안 되며 후속 줄은 들여쓰기되어야 합니다. 예를 들어:
# 시작 구분 기호와 정렬 leapcell_foo = long_function_name(var_one, var_two, var_three, var_four) # 다른 코드와 구별하기 위해 더 많은 들여쓰기 사용 def long_function_name( var_one, var_two, var_three, var_four): print(var_one) # 매달린 들여쓰기, 추가 들여쓰기 수준을 추가해야 합니다. leapcell_foo = long_function_name( var_one, var_two, var_three, var_four)
연속적인 줄의 경우 4개의 공백 들여쓰기가 필수는 아닙니다.
if
문이 여러 줄에 걸쳐 있는 경우if
키워드 뒤에 공백이 오고 왼쪽 괄호가 들여쓰기를 형성합니다. 후속 줄에는 추가 들여쓰기, 주석 추가 또는 추가 들여쓰기 추가(권장)와 같은 여러 형식이 있습니다.
# 추가 들여쓰기 없음 if (this_is_one_thing and that_is_another_thing): do_something() # 주석 추가 # 구문 강조를 지원합니다. if (this_is_one_thing and that_is_another_thing): # 두 조건이 모두 참이므로 frobnicate할 수 있습니다. do_something() # 추가 들여쓰기 추가, 권장 if (this_is_one_thing and that_is_another_thing): do_something()
- 닫는 괄호가 새 줄에 있는 경우 닫는 괄호를 백업하는 형식이 권장됩니다.
# 닫는 괄호 백업 leapcell_my_list = [ 1, 2, 3, 4, 5, 6, ] leapcell_result = some_function_that_takes_arguments( 'a', 'b', 'c', 'd', 'e', 'f', )
공백 또는 탭
- 공백은 기본 들여쓰기 방법입니다.
- 탭으로 들여쓰기된 기존 코드와 일관성을 유지해야 하는 경우에만 탭을 사용하십시오.
- 들여쓰기에 탭과 공백을 혼합하는 것은 Python 3에서 엄격히 금지됩니다. Python 2에서 혼합 들여쓰기가 있는 코드는 모두 공백 들여쓰기로 변환해야 합니다. Python 2 명령줄 인터프리터는
-t
옵션을 통해 잘못된 혼합 들여쓰기에 대한 경고를 발행할 수 있으며-tt
옵션은 경고를 오류로 업그레이드합니다. 이러한 두 옵션을 사용하는 것이 좋습니다. 동시에pep8
및autopep8
모듈을 권장합니다.
최대 줄 너비
- 모든 코드 줄의 최대 너비는 79자로 제한되고, 독스트링 또는 주석의 줄 길이는 72자로 제한됩니다.
- 팀이 합의하면 줄 너비를 80자에서 100자(최대 99자)로 늘릴 수 있지만 독스트링과 주석은 여전히 72자 길이를 유지하는 것이 좋습니다. Python 표준 라이브러리는 보다 보수적인 줄 너비 제한인 79자(독스트링/주석의 경우 72자)를 채택합니다.
- 줄을 계속하는 가장 좋은 방법은 괄호, 대괄호 및 중괄호를 사용하는 것입니다. 백슬래시는
with
문과 같이 적절한 시나리오에서 사용할 수 있습니다.
with open('/path/to/some/file/you/want/to/read') as leapcell_file_1, \ open('/path/to/some/file/being/written', 'w') as leapcell_file_2: leapcell_file_2.write(leapcell_file_1.read())
이항 연산자의 줄 연속
이항 연산자에서 줄을 계속할 때 기존 권장 사항은 연산자 뒤에서 끊는 것이지만 이는 가독성에 영향을 줄 수 있습니다. 수학적 전통에 따라 이항 연산자 앞에서 끊는 것이 일반적으로 코드를 더 읽기 쉽게 만듭니다. Python 코드에서는 로컬에서 일관성이 있는 한 연산자 앞이나 뒤에서 끊는 것이 허용됩니다. 새 코드의 경우 연산자 앞에서 끊는 Knuth 스타일을 채택하는 것이 좋습니다.
# 연산자는 피연산자와 일치하기 쉽습니다. leapcell_income = (gross_wages + taxable_interest + (dividends - qualified_dividends) - ira_deduction - student_loan_interest)
빈 줄
- 최상위 함수 및 클래스의 정의는 두 개의 빈 줄로 구분됩니다.
- 클래스의 메서드 정의는 하나의 빈 줄로 구분됩니다.
- 필요에 따라 함수 내에서 서로 다른 함수 그룹 또는 논리 블록을 분리하는 데 추가 빈 줄을 사용할 수 있지만 과도한 사용은 피해야 합니다.
소스 파일 인코딩
- 핵심 Python 릴리스의 코드는 항상 UTF-8(Python 2에서는 ASCII)을 사용해야 합니다.
- ASCII 파일(Python 2) 또는 UTF-8(Python 3)에는 인코딩 선언이 필요하지 않습니다. 표준 라이브러리의 기본이 아닌 인코딩은 테스트 또는 비ASCII 문자가 포함된 주석 및 독스트링(예: 작성자 이름)에만 사용됩니다. 이 경우
\x
,\u
,\U
또는\N
을 사용하십시오. - Python 3.0 이상 버전의 경우 PEP 3131을 참조하여 표준 라이브러리에서 ASCII 식별자를 사용해야 하며 가능한 한 영어 글자만 사용해야 합니다. 문자열과 주석도 비ASCII 함수와 라틴 문자가 아닌 알파벳으로 된 작성자 이름을 테스트하는 경우를 제외하고는 ASCII여야 합니다.
임포트
- Import 문은 한 줄을 차지해야 합니다.
# 올바른 예 import os import sys # 잘못된 예 import sys, os
다음 형식을 사용할 수도 있습니다.
from subprocess import Popen, PIPE
- Import 문은 파일의 맨 위에, 모듈 주석 및 독스트링 뒤에, 모듈 전역 변수 및 상수 앞에 있어야 합니다. Import 순서는 표준 라이브러리 import, 관련 타사 라이브러리 import, 로컬 라이브러리 import이며, 각 import 그룹을 분리하는 데 빈 줄이 사용됩니다.
all
관련 import는 다른 import 뒤에 배치해야 합니다.- 절대 경로 import를 사용하는 것이 좋습니다. 더 읽기 쉽고 성능이 더 좋기 때문입니다(또는 최소한 더 나은 오류 메시지를 제공할 수 있습니다).
import mypkg.sibling from mypkg import sibling from mypkg.sibling import example
절대 경로가 너무 긴 경우 상대 경로 import를 사용할 수 있습니다.
from . import sibling from .sibling import example
표준 라이브러리의 코드는 복잡한 패키지 레이아웃을 피하고 항상 절대 import를 사용해야 합니다. Python 3에서는 암시적 상대 import를 피하고 제거해야 합니다.
- 클래스를 import할 때 다음 방법을 사용할 수 있습니다.
from myclass import MyClass from foo.bar.yourclass import YourClass
로컬 명명 충돌이 있는 경우 다음을 사용할 수 있습니다.
import myclass import foo.bar.yourclass
- 와일드카드 import(
from <module> import *
)는 네임스페이스를 불분명하게 만들기 때문에 금지됩니다. 외부 API를 다시 게시할 때만 고려할 수 있습니다.
문자열 따옴표
- Python에서 작은따옴표 문자열과 큰따옴표 문자열은 기능이 동일합니다. 가독성을 높이기 위해 문자열에 백슬래시를 사용하지 않도록 하십시오.
- PEP 257에 따라 삼중 따옴표 문자열은 큰따옴표를 사용해야 합니다.
표현식 및 문의 공백
- 괄호 안에 공백을 추가하지 마십시오.
# 올바른 예 spam(ham[1], {eggs: 2}) # 잘못된 예 spam( ham[ 1 ], { eggs: 2 } )
- 후행 쉼표와 닫는 괄호 사이에 공백이 없어야 합니다.
# 올바른 예 leapcell_foo = (0,) # 잘못된 예 leapcell_bar = (0, )
- 쉼표, 콜론 및 세미콜론 앞에 공백을 두지 마십시오.
# 올바른 예 if x == 4: print x, y; x, y = y, x # 잘못된 예 if x == 4 : print x , y ; x , y = y , x
- 인덱싱 작업에서 연산자로서의 콜론은 앞뒤에 일관된 공백이 있어야 합니다(공백을 사용하지 않는 것이 좋습니다).
# 올바른 예 ham[1:9], ham[1:9:3], ham[:9:3], ham[1::3], ham[1:9:] ham[lower:upper], ham[lower:upper:], ham[lower::step] ham[lower+offset : upper+offset] ham[: upper_fn(x) : step_fn(x)], ham[:: step_fn(x)] ham[lower + offset : upper + offset] # 잘못된 예 ham[lower + offset:upper + offset] ham[1: 9], ham[1 :9], ham[1:9 :3] ham[lower : : upper] ham[ : upper]
- 함수 호출의 왼쪽 괄호 앞에 공백이 없어야 합니다.
# 올바른 예 spam(1) dct['key'] = lst[index] # 잘못된 예 spam (1) dct ['key'] = lst [index]
- 정렬을 목적으로 할당 연산자 및 기타 연산자 앞뒤에 여러 개의 공백을 추가해서는 안 됩니다.
# 올바른 예 leapcell_x = 1 leapcell_y = 2 leapcell_long_variable = 3 # 잘못된 예 leapcell_x = 1 leapcell_y = 2 leapcell_long_variable = 3
코드 검사 도구
소프트웨어 프로젝트 유지 관리 과정에서 일관된 코드 스타일과 테스트 표준을 유지하는 것이 중요합니다. 유지 관리 부담을 줄이고 새로운 개발자가 프로젝트에 빠르게 익숙해지도록 돕고 애플리케이션의品質을保証할 수 있습니다. 외부 라이브러리를 사용하여 코드 品質을 검사하는 것은 프로젝트의 유지 관리성을 유지하는 효과적인 방법입니다. 다음은 일반적으로 사용되는 Python 코드 스타일 검사 및 형식 지정 도구입니다.
코드 스타일 검사 도구
- Pylint: PEP 8 사양 위반 및 일반적인 오류를 검사하는 데 사용되는 라이브러리입니다. 인기 있는 편집기 및 IDE에 통합할 수 있으며 명령줄에서 실행하는 것도 지원합니다.
pip install pylint
를 통해 설치한 후pylint [options] path/to/dir
또는pylint [options] path/to/module.py
를 사용하여 검사하면 결과가 콘솔에 출력됩니다.pylintrc
구성 파일을 통해 검사 규칙을 사용자 지정할 수도 있습니다. - Flake8: PEP 8, Pyflakes(Pylint와 유사), McCabe(코드 복잡성 검사기) 및 타사 플러그인을 통합하여 Python 코드의 스타일과 品質을 검사하는 데 사용됩니다. 설치 명령은
pip install flake8
이고flake8 [options] path/to/dir
또는flake8 [options] path/to/module.py
를 실행하여 오류 및 경고를 확인합니다. 구성 파일을 통해 검사 내용을 사용자 지정하는 것을 지원합니다. 설명서는 개발 워크플로에 통합할 수 있는 유용한 커밋 후크를 제공합니다. 또한 플러그인(예: Sublime Text용 Flake8 플러그인)을 통해 편집기 또는 IDE에 통합할 수도 있습니다. - Isort: 프로젝트에서 가져온 라이브러리를 알파벳순으로 정렬하고 표준 라이브러리, 타사 라이브러리 및 자체 구축 라이브러리와 같은 부분을 올바르게 나누어 코드 가독성을 향상시킬 수 있습니다.
pip install isort
를 사용하여 설치하고isort path/to/module.py
를 실행합니다..isort.cfg
파일을 구성하여 라이브러리의 다중 줄 import를 처리할 수도 있습니다. 또한 인기 있는 편집기 및 IDE와의 통합을 지원합니다.
코드 형식 지정 도구
- Autopep8: 줄 다시 들여쓰기, 들여쓰기 수정, 중복 공백 제거 및 일반적인 비교 오류(예: 부울值 및 None值) 리팩터링을 포함하여 지정된 모듈의 코드를 자동으로 형식 지정할 수 있습니다.
pip install --upgrade autopep8
을 통해 설치하고autopep8 --in-place --aggressive --aggressive
를 실행하여 코드를 형식 지정합니다.aggressive
옵션의 수는 코드 스타일에 대한 제어 정도를 결정합니다. - Yapf: PEP 8 사양을 위반하는 위치를 지적할 뿐만 아니라 스타일은 일관성이 없지만 사양을 위반하지 않는 코드를 다시 형식 지정하여 가독성을 높일 수 있습니다. 설치 명령은
pip install yapf
이고yapf [options] path/to/dir
또는yapf [options] path/to/module.py
를 사용하여 코드를 형식 지정합니다. 사용자 지정 옵션의 전체 목록을 통해 구성할 수 있습니다. - Black: 비교적 새로운 코드 검사 도구입니다. Autopep8 및 Yapf와 유사하지만 사용자 지정 옵션이 적고 코드 스타일을 수동으로 결정할 필요가 없습니다. Python 3.6+에 의존하며 Python 2 코드도 형식 지정할 수 있습니다.
pip install black
을 통해 설치하고black path/to/dir
또는black path/to/module.py
를 실행하여 코드를 최적화합니다. 제한된 사용자 지정 옵션 및 구성 방법을 참조할 수 있습니다.
테스트 커버리지 검사 도구
Coverage: 테스트 커버리지를 계산하는 데 사용되며 콘솔 또는 HTML 페이지에 출력하고 커버되지 않은 코드 줄을 표시하는 것과 같은 여러 표시 방법을 제공합니다. 구성 파일을 통해 검사 내용을 사용자 지정하는 것을 지원합니다. 설치 명령은 pip install coverage
이고 coverage [path/to/module.py] [args]
를 실행하여 프로그램을 실행하고 결과를 확인합니다. coverage report -m
을 사용하여 커버되지 않은 코드 줄을 볼 수 있습니다.
Leapcell: 최고의 서버리스 웹 호스팅
마지막으로 Python 서비스를 배포하는 데 가장 적합한 플랫폼인 **Leapcell**을 추천하고 싶습니다.
🚀 좋아하는 언어로 빌드
JavaScript, Python, Go 또는 Rust로 쉽게 개발하세요.
🌍 무료로 무제한 프로젝트 배포
사용한 만큼만 지불하세요. 요청, 요금이 없습니다.
⚡ 사용량에 따른 요금, 숨겨진 비용 없음
유휴 요금 없이 원활한 확장성만 제공합니다.
🔹 Twitter에서 팔로우하세요: @LeapcellHQ