23.06.15
DEVOTEE를 활성화 시키면
지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.
버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.
| 컨텐츠 유형 | 제목 | 저장일 | 삭제 |
|---|
본인인증 로그인에 실패하였습니다.
회원이 아니시거나 본인인증 등록이
완료되지 않은 사용자입니다.
Ruff는 Rust로 작성된 매우 빠른 Python linter 및 code formatter입니다. 기존의 도구들의 다양한 역할을 하나로 통합하여 코드에 대한 품질 검사와 포맷팅을 수행합니다.
Rust로 작성되서 기존 도구 대비 10-100배 빠른 속도를 자랑하고 있습니다.
Linting the CPython codebase from scratch.
이번 글에서는 Ruff가 Python 코드 품질 도구로 널리 알려진 Flake8, isort, Black을 어떻게 효과적으로 대체할 수 있는지,
그 설치 및 구성 방법, 그리고 pre-commit을 통해 코드 베이스에 코드를 커밋하기 전에 미리 검사하고 수정할 수 있도록 하는 방법에 대해 다룹니다.
Python 개발에서 코드 품질을 유지하기 위해 사용되는 다양한 도구들 중 가장 널리 사용되는 것들은 다음과 같습니다:
Flake8: Python 코드의 문법 오류 및 코딩 스타일 위반을 검사하는 linter
isort: Python import 문을 자동 정렬 도구
Black: Python 코드 스타일을 자동으로 포맷팅하는 도구
기존 도구들은 각각 특정 기능에 초점을 맞추어 개발되었지만, 여러 도구를 함께 사용해야 하는 복잡성과 성능 이슈가 존재했습니다.
코드베이스가 커짐에 따라 이러한 도구들의 실행 시간이 길어지면 개발 효율성을 저하시키는 문제가 있습니다.
이러한 문제를 해결하기 위해 Rust로 작성된 Ruff가 등장했습니다.
지금은 Apache Airflow, Superset, FastAPI, Hugging Face, Pandas, SciPy 등 메이저 오픈 소스에서 널리 사용되고 있으며 지원하는 빌트인 규칙이 800개 이상이며 플러그인 시스템을 통해 추가적인 규칙을 지원합니다.
속도: 기존 linter(Flake8)와 formatter(Black)보다 10-100배 빠름
통합 기능: Flake8, isort, Black에 대한 Drop-in 대체재
자동 수정: 사용되지 않는 import 문 제거 등 자동 오류 수정 지원
캐싱: 변경되지 않은 파일은 재분석하지 않음
풍부한 규칙: 800개 이상의 내장 규칙 지원
Ruff는 pip를 통해 쉽게 설치할 수 있습니다:
pip install ruff설치 후 다음과 같이 사용할 수 있습니다:
# 현재 디렉토리의 Python 파일 검사
ruff check .
# 자동 수정 기능 사용
ruff check --fix .
# 코드 포맷팅
ruff format .Ruff는 pyproject.toml, ruff.toml 또는 .ruff.toml 파일을 통해 구성할 수 있습니다.
[tool.ruff]
# Exclude a variety of commonly ignored directories.
exclude = [
".git",
".venv",
]
# Code Formatting (Black) configuration
line-length = 120
indent-width = 4
# Assume Python 3.12
target-version = "py312"
[tool.ruff.lint]
# Enable Pyflakes (`F`) and a subset of the pycodestyle (`E`) codes by default.
# Unlike Flake8, Ruff doesn't enable pycodestyle warnings (`W`) or
# McCabe complexity (`C901`) by default.
select = ["E4", "E7", "E9", "F", "I"]
ignore = []
# Allow fix for all enabled rules (when `--fix`) is provided.
fixable = ["ALL"]
unfixable = []
# Allow unused variables when underscore-prefixed.
dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$"
[tool.ruff.format]
# Like Black, use double quotes for strings.
quote-style = "double"
# Like Black, indent with spaces, rather than tabs.
indent-style = "space"
# Like Black, respect magic trailing commas.
skip-magic-trailing-comma = false
# Like Black, automatically detect the appropriate line ending.
line-ending = "auto"
# Enable auto-formatting of code examples in docstrings. Markdown,
# reStructuredText code/literal blocks and doctests are all supported.
#
# This is currently disabled by default, but it is planned for this
# to be opt-out in the future.
docstring-code-format = false
# Set the line length limit used when formatting code snippets in
# docstrings.
#
# This only has an effect when the `docstring-code-format` setting is
# enabled.
docstring-code-line-length = "dynamic"대규모 코드베이스에서 Ruff로 마이그레이션하는 권장 전략은 다음과 같습니다:
1단계: Ruff를 코드베이스에 추가하고 규칙 없이 실행
2단계: 최소한의 Ruff 설정을 제공하고, 필요한 규칙을 하나씩 추가하며 호환성 확인
3단계: 규칙을 하나씩 또는 작은 배치로 활성화하고 코드를 수정
기존 Flake8 설정을 Ruff 설정으로 변환하려면 flake8-to-ruff 도구를 사용할 수 있습니다:
pip install flake8-to-ruff
flake8-to-ruff path/to/setup.cfg
flake8-to-ruff path/to/tox.ini
flake8-to-ruff path/to/.flake8이 도구는 해당 파일을 분석하여 Ruff 호환 pyproject.toml 섹션을 생성합니다.
pre-commit을 활성화해두면 커밋될때 마다 자동으로 코드 품질 검사와 포맷팅을 수행합니다.
이를 통해 일관된 코드 스타일과 정적 문법 오류를 줄일 수 있습니다.
기존의 경우 pre-commit 설정을 다음과 같이 Flake8, isort, Black으로 구성했습니다.
# .pre-commit-config.yaml
repos:
- repo: https://github.com/PyCQA/isort
rev: 6.0.1
hooks:
- id: isort
exclude: ^app/alembic/.*$
- repo: https://github.com/ambv/black
rev: 25.1.0
hooks:
- id: black
args: [--line-length=120]
exclude: ^app/alembic/.*$
- repo: https://github.com/pycqa/flake8
rev: 7.1.2
hooks:
- id: flake8
args: [--config=.flake8]
exclude: ^app/alembic/.*$Ruff를 사용하는 경우 다음과 같이 통합해서 설정 가능합니다.
# .pre-commit-config.yaml
repos:
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.11.8
hooks:
- id: ruff
args: [--fix]
- id: ruff-format
args: [--line-length=120]
exclude: ^app/alembic/.*$설정한 pre-commit 훅을 설치하고 모든 파일 검사 및 수정을 수행할 수 있습니다.
# pre-commit 훅 설치
uvx pre-commit clean
uvx pre-commit install
# 모든 파일 검사 및 수정
uvx pre-commit run --all-filesRuff를 사용하면 Flake8, isort, Black을 대체할 수 있을 뿐만 아니라 다음과 같은 효과를 얻을 수 있습니다:
코드 리뷰 프로세스 간소화: 일관된 코드 품질을 유지하고 리뷰 시간 단축
CI/CD 파이프라인 통합: 자동화된 품질 체크를 통한 지속적인 코드 품질 관리
개발 효율성 향상: 빠른 피드백 루프로 실시간 품질 문제 식별 및 수정
Ruff는 Flake8, isort, Black의 기능을 하나로 통합한 초고속 Python 코드 품질 관리 도구입니다.
기존 도구들보다 10~100배 빠르며, 대부분의 규칙과 포맷팅 방식을 호환해 손쉽게 대체설치와 설정이 간편해 대규모 프로젝트에서도 효율적인 코드 품질 관리가 가능합니다.
Pre-commit을 통해 커밋될때 마다 자동으로 코드 품질 검사와 포맷팅을 수행합니다.
DEVOTEE를 활성화 시키면
지금 작성한 댓글에 AI가 댓글을 달아줍니다.