Astral의 Ruff(린터/포매터)와 ty(타입 체커)를 다룹니다. 기존 도구 대체, 설정 방법, 규칙 커스터마이징, IDE 통합, 프로젝트 도입 전략을 안내합니다.
Python 프로젝트의 코드 품질 관리에는 전통적으로 여러 도구가 필요했습니다.
코드 린팅: flake8 + 플러그인 (flake8-bugbear, flake8-import-conventions 등)
코드 포매팅: black
임포트 정렬: isort
코드 업그레이드: pyupgrade
보안 검사: banditRuff는 이 모든 도구를 하나의 바이너리로 통합합니다. Rust로 작성되어 flake8 대비 10~100배 빠르며, 800개 이상의 린트 규칙을 내장하고 있습니다.
# uv로 설치 (권장)
uv tool install ruff
# pip로 설치
pip install ruff
# Homebrew
brew install ruff
# 버전 확인
ruff --version# 현재 디렉토리 검사
ruff check .
# 특정 파일 검사
ruff check src/main.py
# 자동 수정 가능한 문제 수정
ruff check --fix .
# 안전하지 않은 수정도 포함
ruff check --fix --unsafe-fixes .
# 차이점 미리보기
ruff check --diff .Ruff의 규칙은 기존 도구의 규칙 코드를 따릅니다. 접두사로 어떤 도구에서 유래했는지 구분합니다.
E/W - pycodestyle (스타일 규칙)
F - Pyflakes (논리적 오류)
I - isort (임포트 정렬)
N - pep8-naming (네이밍 규칙)
UP - pyupgrade (최신 문법 권장)
B - flake8-bugbear (버그 유발 패턴)
S - bandit/flake8-bandit (보안)
C4 - flake8-comprehensions (컴프리헨션 최적화)
SIM - flake8-simplify (코드 단순화)
RUF - Ruff 고유 규칙[tool.ruff]
# 대상 Python 버전
target-version = "py312"
# 줄 길이
line-length = 88
# 검사할 디렉토리
src = ["src", "tests"]
# 제외할 패턴
exclude = [
".venv",
"__pycache__",
"migrations",
]
[tool.ruff.lint]
# 활성화할 규칙 세트
select = [
"E", # pycodestyle errors
"W", # pycodestyle warnings
"F", # Pyflakes
"I", # isort
"N", # pep8-naming
"UP", # pyupgrade
"B", # flake8-bugbear
"S", # flake8-bandit (보안)
"C4", # flake8-comprehensions
"SIM", # flake8-simplify
"RUF", # Ruff 고유 규칙
]
# 무시할 규칙
ignore = [
"E501", # line too long (포매터가 처리)
"S101", # assert 사용 (테스트에서 필요)
]
# 파일별 규칙 예외
[tool.ruff.lint.per-file-ignores]
"tests/**/*.py" = ["S101", "S106"] # 테스트에서 assert, 하드코딩 비밀번호 허용
"__init__.py" = ["F401"] # 미사용 임포트 허용
[tool.ruff.lint.isort]
# 알려진 퍼스트파티 모듈
known-first-party = ["mypackage"]
[tool.ruff.lint.pep8-naming]
# 커스텀 네이밍 규칙
classmethod-decorators = ["pydantic.validator"]Ruff 0.1.2부터 코드 포매터를 내장합니다. Black과 거의 동일한 출력을 생성하며, 훨씬 빠릅니다.
# 코드 포매팅
ruff format .
# 포매팅 확인 (수정하지 않음)
ruff format --check .
# 차이점 표시
ruff format --diff .
# 특정 파일만
ruff format src/main.py[tool.ruff.format]
# 따옴표 스타일
quote-style = "double"
# 들여쓰기 스타일
indent-style = "space"
# 줄 끝 문자
line-ending = "auto"
# 매직 트레일링 콤마
skip-magic-trailing-comma = false
# docstring 포매팅
docstring-code-format = true
docstring-code-line-length = 72Ruff 포매터는 Black과 99.9% 이상의 호환성을 가집니다. Black에서 Ruff 포매터로 전환할 때 대부분의 프로젝트에서 차이가 거의 없습니다. 미세한 차이는 주로 매직 트레일링 콤마 처리와 관련됩니다.
Ruff의 UP(pyupgrade) 규칙은 코드를 최신 Python 문법으로 자동 업그레이드합니다. Python 3.12+를 대상으로 설정하면 다음과 같은 변환이 적용됩니다.
# UP006: typing 모듈 대신 내장 타입 사용
# 변환 전
from typing import List, Dict, Optional
def process(items: List[Dict[str, int]]) -> Optional[str]: ...
# 변환 후
def process(items: list[dict[str, int]]) -> str | None: ...
# UP007: Union 대신 | 연산자
# 변환 전
from typing import Union
x: Union[int, str] = 42
# 변환 후
x: int | str = 42
# UP040: TypeAlias 대신 type 문 (3.12+)
# 변환 전
from typing import TypeAlias
Vector: TypeAlias = list[float]
# 변환 후
type Vector = list[float]ty는 Astral이 개발한 Python 타입 체커로, mypy와 Pyright의 대안입니다. Rust로 작성되어 10~100배 빠른 타입 검사를 제공합니다.
# 설치
uv tool install ty
# 타입 검사 실행
ty check src/
# 특정 파일 검사
ty check src/main.py
# 설정 파일 생성
ty init1. 속도: mypy 대비 10~100배 빠름
2. 교차 타입 (Intersection Types): 네이티브 지원
3. 고급 타입 좁히기 (Type Narrowing): 정교한 분석
4. 도달 가능성 분석 (Reachability Analysis): 도달 불가능 코드 감지
5. 언어 서버: LSP 프로토콜 지원 (IDE 통합)[tool.ty]
# Python 버전
python-version = "3.12"
# 소스 디렉토리
src = ["src"]
# 규칙 설정
[tool.ty.rules]
# 오류 수준 규칙
possibly-unbound = "error"
division-by-zero = "error"
# 경고 수준 규칙
unused-variable = "warn"ty는 LSP(Language Server Protocol) 기반의 언어 서버를 내장합니다. VS Code, PyCharm, Neovim 등에서 사용할 수 있습니다.
- 코드 탐색 (Go to Definition, Find References)
- 자동완성 (Completions)
- 인레이 힌트 (Inlay Hints)
- 호버 정보 (Hover Information)
- 코드 액션 (Code Actions, Auto-import)
- 실시간 진단 (Diagnostics)# VS Code: Ruff 확장 설치 시 ty가 자동으로 통합
# Neovim: LSP 설정에 ty 추가
ty serverRuff와 ty를 함께 사용하면 완전한 코드 품질 파이프라인을 구축할 수 있습니다.
[tool.ruff]
target-version = "py312"
line-length = 88
src = ["src"]
[tool.ruff.lint]
select = ["E", "W", "F", "I", "N", "UP", "B", "C4", "SIM", "RUF"]
[tool.ruff.format]
quote-style = "double"
docstring-code-format = true
[tool.ty]
python-version = "3.12"
src = ["src"]# 1. 코드 포매팅
ruff format .
# 2. 린트 검사 및 자동 수정
ruff check --fix .
# 3. 타입 검사
ty check src/
# 또는 uv run으로 통합 실행
uv run ruff format .
uv run ruff check --fix .
uv run ty check src/repos:
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.9.0
hooks:
- id: ruff
args: [--fix]
- id: ruff-format# pre-commit 설치
uv tool install pre-commit
pre-commit install
# 수동 실행
pre-commit run --all-files# flake8 설정을 Ruff로 변환
# .flake8 또는 setup.cfg의 설정을 pyproject.toml로 이동
# flake8의 주요 규칙은 Ruff에서 동일한 코드로 지원
# 플러그인은 대부분 내장 규칙으로 대체 가능flake8-bugbear -> B 규칙
flake8-comprehensions -> C4 규칙
flake8-simplify -> SIM 규칙
flake8-bandit -> S 규칙
flake8-import-conventions -> ICN 규칙
pep8-naming -> N 규칙# 기존 도구 제거
uv remove black isort
# Ruff가 대체
# pyproject.toml에서 [tool.black]과 [tool.isort] 섹션을
# [tool.ruff.format]과 [tool.ruff.lint.isort]로 변환호환되는 기능:
- 기본 타입 검사
- Generic, Protocol, TypedDict
- PEP 695 새 문법
ty 고유 기능:
- 교차 타입 (Intersection Types)
- 더 정밀한 타입 좁히기
- 빠른 증분 분석
전환 시 주의:
- mypy 플러그인 시스템은 ty에서 지원하지 않음 (향후 계획)
- 일부 엣지 케이스에서 다른 결과가 나올 수 있음
- ty는 2026년 기준 아직 베타 단계ty는 2025년 12월에 베타가 출시되었으며, 2026년 기준 아직 안정 버전(1.0)이 나오지 않았습니다. 프로덕션 프로젝트에서는 mypy나 Pyright와 병행 사용하면서 점진적으로 전환하는 것을 권장합니다.
린팅:
flake8: 30.0s
Ruff: 0.3s (약 100배 빠름)
포매팅:
Black: 10.0s
Ruff: 0.1s (약 100배 빠름)
타입 체킹:
mypy: 60.0s
ty: 3.0s (약 20배 빠름)2026년 3월, OpenAI가 Astral을 인수했습니다. Ruff, uv, ty는 OpenAI의 Codex 팀에 통합될 예정이며, AI 코드 생성 시 자동으로 린팅, 포매팅, 타입 검사를 수행하는 방향으로 발전할 것으로 예상됩니다.
OpenAI는 인수 후에도 이 도구들의 오픈소스 지원을 계속하겠다고 발표했습니다.
Ruff와 ty는 Python 코드 품질 도구의 새로운 표준을 제시합니다.
11장에서는 Python typing 모듈의 고급 기능을 다룹니다. TypedDict, Protocol, dataclass_transform, override 데코레이터 등 실전 타입 시스템 활용법을 살펴봅니다.
이 글이 도움이 되셨나요?
Python 3.12~3.13의 typing 모듈 고급 기능을 다룹니다. TypedDict, Protocol, override, dataclass_transform, TypeGuard, TypeIs 등 실전 타입 시스템을 안내합니다.
Rust로 작성된 차세대 Python 패키지 매니저 uv를 다룹니다. 설치, 프로젝트 관리, 가상 환경, Python 버전 관리, 스크립트 실행까지 실전 워크플로우를 안내합니다.
AI/ML 개발에서 Python이 차지하는 위치와 최신 트렌드를 다룹니다. PyTorch 생태계, LLM 개발 도구, 타입 안전한 AI 파이프라인, free-threaded Python의 AI 활용을 살펴봅니다.