Python 포맷 도구
Python 포매팅이란?
Python 포매팅은 정리되지 않은 Python 코드를 표준화된 읽기 쉬운 형식으로 조직하는 과정입니다. 좋은 코드 포매팅은 가독성을 향상하고, 디버깅을 쉽게 하고, 오류를 줄입니다. Python은 인덴트로 코드 블록을 정의하므로, 올바른 포매팅이 특히 중요합니다. 포매팅에는: 일관된 인덴트, 적절한 줄바꿈, 연산자 스페이스가 포함됩니다. 압축은 모든 공백과 주석을 제거하고 파일 크기를 크게 줄입니다.
사용 방법
사용 방법
- 왼쪽 입력 상자에 Python 코드를 붙여넣거나 입력하세요
- 들여쓰기 크기를 선택하세요 (2칸, 4칸, 또는 Tab)
- '포맷'을 클릭하여 코드를 정리하거나, '축소'를 클릭하여 압축하세요
- 오른쪽에서 결과를 확인하세요 (구문 강조 포함)
- '복사'를 클릭하여 클립보드에 복사하세요
옵션 설명
Python 팁
- Python은 들여쓰기에 민감하므로, 결과를 프로젝트에 다시 복사하기 전에 포맷된 제어 블록을 확인하세요.
- 포맷팅은 타입 검사, import, 테스트를 실행하지 않습니다. 동작과 의존성 검증에는 평소 사용하는 Python 도구를 사용하세요.
활용 사례
기술 원리
Python은 중괄호 대신 들여쓰기로 코드 블록을 정의하는 몇 안 되는 주류 언어 중 하나이다. 같은 들여쓰기 수준의 연속 문장은 같은 블록에 속하며, 한 칸이라도 차이가 나면 의미가 바뀐다. 이 설계로 코드의 시각적 구조가 논리와 일치하지만, 포매터가 논리적 레벨을 정확하게 식별해야 한다. 포매터는 먼저 tokenize 모듈이나 사용자 정의 렉서로 코드를 스캔하여 각 줄의 선행 공백을 들여쓰기 정보로 처리한다. 괄호(소괄호, 대괄호, 중괄호) 안의 문장은 여러 줄에 걸칠 수 있으며, 이 경우 들여쓰기는 선행 공백이 아닌 괄호 깊이에 의해 결정된다. 문자열 리터럴(삼중 따옴표, 단일 따옴표) 내부의 공백은 건드리면 안 된다. 그렇지 않으면 문자열 값이 변경된다. PEP 8은 Python의 공식 스타일 가이드로, 4칸 들여쓰기, 줄당 최대 79자, 연산자 주변 공백, 그룹화된 import, 네이밍 규칙을 규정한다. Black은 설정 없는 포매터 학파의 대표적 예로, 이중 따옴표 문자열, 후행 쉼표, 88자 줄 길이를 강제하며 엄격하고 구성 불가능한 규칙을 적용한다. yapf는 Google 스타일에 가깝고 구성 가능하다.
- 들여쓰기 의미: Python은 선행 공백으로 코드 블록을 결정. 같은 들여쓰기 = 같은 블록, 들여쓰기 변경 = 스코프 전환.
- PEP 8 규칙: 4칸 들여쓰기, 줄 폭 79자, 연산자 주변 공백, 클래스명 CapWords, 함수명 snake_case.
- 괄호 줄바꿈: 괄호(소괄호, 대괄호, 중괄호) 안의 문장은 줄바꿈 가능하며, 들여쓰기는 선행 공백이 아닌 괄호 깊이에 의해 결정.
- 문자열 경계: 삼중 따옴표 문자열과 docstring 내부의 공백은 변경하면 안 되며, 그렇지 않으면 리터럴 내용이 깨짐.
- Black 스타일: 제로 설정, 사용자 정의 불가, 이중 따옴표 강제, 후행 쉼표, 줄당 88자, 프로젝트 전체에서 동일.
- 타입 어노테이션: PEP 484에서 도입. 포매터는 `->` 반환 타입과 매개변수 `: 타입` 어노테이션 주변의 적절한 공백을 보존.
예시
함수 정의 포매팅
입력: def add(a,b):
return a+b
def subtract(a,b):
return a-b
출력:
def add(a, b):
return a + b
def subtract(a, b):
return a - b리스트 컴프리헨션 포매팅
입력: result=[x*x for x in range(10) if x%2==0]
result2={k:v for k,v in items if v>0}
출력:
result = [x * x for x in range(10) if x % 2 == 0]
result2 = {k: v for k, v in items if v > 0}클래스 정의 포매팅
입력: class User:
def __init__(self,name,email):
self.name=name
self.email=email
def __repr__(self):
return f"User({self.name})"
출력:
class User:
def __init__(self, name, email):
self.name = name
self.email = email
def __repr__(self):
return f"User({self.name})"자주 묻는 질문
어떤 Python 스타일을 사용하나요?
대부분의 빌드는 PEP 8 규칙을 따르며, 보통 Black을 사용합니다. 88열 줄 너비, 큰따옴표 문자열, 후행 세미콜론 없음. Black은 의견이 강해 대부분의 설정 옵션을 제거하여 프로젝트 전반에 일관된 스타일을 강제합니다. 더 유연성이 필요하면 autopep8과 yapf에 옵션이 더 많습니다.
포매터에 들여쓰기가 중요한가요?
네 — Python에서 들여쓰기는 블록 구조를 정의합니다. 포매터는 기존 블록 경계를 존중합니다. 입력에 탭/공백이 섞여 있거나 들여쓰기 수준이 잘못되었다면 포매팅 전에 파싱이 실패합니다.
import 순서도 정리해 주나요?
Black, autopep8, yapf는 공백만 처리합니다. import를 정렬하고 그룹화하려면 isort(또는 ruff --fix)를 사용하세요. 일부 페이지는 두 가지를 결합하므로, 실제로 무엇이 적용되는지 설정을 확인하세요.
타입 힌트도 지원되나요?
최신 파서는 지원합니다. 함수 시그니처, 변수, 클래스 속성에 적용된 타입 어노테이션(PEP 526, 484, 612)은 정확히 포매팅됩니다. 매우 새로운 문법(3.12+의 PEP 695 제네릭 문법)은 최신 파서가 필요하며, 이전 빌드에서는 처리하지 못할 수 있습니다.
내 코드가 업로드되나요?
아니요. 포매팅은 Python AST의 JavaScript 구현을 사용해 브라우저에서 실행됩니다. 붙여넣은 코드는 전송되지 않습니다.
결과가 CI의 black 결과와 일치하나요?
비슷하지만 항상 동일하지는 않습니다. Black 버전마다 포매팅이 약간 다를 수 있습니다(Black은 규칙을 정기적으로 업데이트합니다). CI 일관성을 위해 같은 Black 버전을 로컬과 CI에서 실행하시고, 이 페이지는 빠른 시각적 점검 용도로 활용하세요.
왜 긴 줄을 여러 줄로 감싸나요?
PEP 8과 Black은 한 줄당 88자 이하를 목표로 합니다. 긴 표현식, 인자가 많은 함수 호출, 체인된 메서드 호출은 가독성을 위해 여러 줄로 나뉩니다. 팀이 100자나 120자를 사용한다면 줄 너비 옵션을 조정하세요.