Python 개발 간소화를 위한 자동 코드 포매팅
Lukas Schneider
DevOps Engineer · Leapcell

소개: 깨끗한 코드의 숨겨진 영웅
빠르게 변화하는 소프트웨어 개발 세계에서 대규모 코드베이스와 여러 개발자에 걸쳐 일관된 코드 스타일을 유지하는 것은 어려운 일이 될 수 있습니다. 포매팅에 대한 불일치, 수동 린팅, 공백에 대한 끊임없는 풀 리퀘스트 댓글은 빠르게 생산성 병목 현상이 될 수 있습니다. 이것은 단순히 미적인 문제가 아닙니다. 일관되지 않은 코드는 읽기, 디버그 및 유지 관리가 더 어려우며, 궁극적으로 개발 주기를 늦추고 오류 가능성을 높입니다. 가독성에 중점을 둔 Python 생태계는 이러한 문제를 완화하기 위한 강력한 도구를 제공합니다. 이 문서는 Black, Ruff 및 Isort를 결합하여 통합된 코드 스타일을 자동화하고 시행하여 개발 워크플로를 원활하고 매우 효율적인 프로세스로 전환하는 방법을 탐구합니다. 이러한 도구를 채택함으로써 우리는 수동 포매팅의 평범한 작업에서 벗어나 진정으로 중요한 것, 즉 영향력 있는 코드 작성에 집중합니다.
자동 포매팅의 기둥 이해
파이프라인 구축에 들어가기 전에 사용할 수 있는 핵심 도구를 이해해 보겠습니다.
- Black: 종종 "타협하지 않는 Python 코드 포매터"라고 불리는 Black은 엄격하고 객관적인 스타일 가이드에 따라 코드를 포매팅하는 결정론적 포매터를 목표로 합니다. Black의 철학은 개발자가 논리에 집중할 수 있도록 스타일 토론을 없애는 것입니다. Black은 전체 파일을 다시 포매팅하며, 줄 바꿈, 들여쓰기 및 간격에 대한 결정을 내리며, 구성 옵션이 거의 없다는 점이 바로 강점입니다.
- Ruff: Rust로 작성된 현대적이고 매우 빠른 Python 린터입니다. Ruff는 Flake8, Pylint, Bandit와 같은 기존 Python 린터보다 훨씬 빠른 속도를 제공하도록 설계되었습니다. 스타일 위반부터 잠재적인 버그까지 수백 가지의 다양한 코드 문제를 감지할 수 있으며, 이러한 문제 중 상당수에 대해 강력한 자동 수정 기능을 제공합니다.
- Isort: Python 임포트를 알파벳순으로 정렬하고 자동으로 섹션 및 유형으로 분리하는 데 특화되어 있습니다. 이를 통해 누가 작성했는지에 관계없이
import
문이 항상 깔끔하고 정리되어 일관성을 유지할 수 있습니다. 잘 정리된 임포트는 가독성을 향상시키고 잠재적인 순환 종속성 문제를 방지합니다.
각각 고유한 초점을 가진 이 세 가지 도구는 자동화된 포매팅 파이프라인의 기본 요소를 나타냅니다.
자동화되고 일관된 Python 코드 포매팅 파이프라인 구축
Black, Ruff 및 Isort의 시너지는 코드 일관성이 단순히 권장되는 것이 아니라 강제되는 강력한 시스템을 만듭니다. 이들의 통합 및 실제 적용을 살펴보겠습니다.
1. 설치
먼저 개발 환경에 이러한 도구를 설치합니다. 일반적으로 프로젝트의 dev
종속성에 포함하는 것이 좋습니다.
pip install black ruff isort
2. Black: 코드 정렬기
Black의 강점은 단순함에 있습니다. 단일 파일 또는 전체 디렉토리를 포매팅하려면 다음과 같이 실행합니다.
black .
Black은 현재 디렉토리 및 하위 디렉토리에 있는 모든 Python 파일을 자동으로 다시 포매팅합니다. 예를 들어, 이 포매팅되지 않은 코드를 고려해 보겠습니다.
def my_function( arg1, arg2): if arg1 > 0: print("Positive") else: return SomeClass("hello", 'world')
black .
를 실행한 후 다음과 같이 변환됩니다.
def my_function(arg1, arg2): if arg1 > 0: print("Positive") else: return SomeClass("hello", "world")
Black이 줄 길이, 들여쓰기 및 큰따옴표 대 작은따옴표(기본적으로 일관성을 위해 작은따옴표를 큰따옴표로 변환하지만, 지정하면 다를 수 있음)를 처리하는 방법을 주목하십시오.
3. Isort: 임포트 정리기
Isort는 임포트가 항상 깔끔하게 유지되도록 합니다. Black과 유사하게 실행할 수 있습니다.
isort .
정렬되지 않은 임포트가 있는 다음 예를 사용해 보겠습니다.
import os import sys from my_module import some_function import json from another_module import another_function
isort .
후에는 다음과 같이 됩니다.
import json import os import sys from another_module import another_function from my_module import some_function
Isort는 표준 라이브러리 임포트, 타사 임포트 및 로컬 애플리케이션 임포트를 그룹화하며, 일반적으로 빈 줄로 구분되고 각 그룹 내에서 알파벳순으로 정렬됩니다. 이는 가독성을 크게 향상시킵니다.
4. Ruff: 속도 마왕 린터 및 포매터
Ruff는 린터이자 점점 더 포매터 역할을 하며 많은 문제를 자동으로 수정할 수 있습니다.
문제를 린팅하고 식별하려면:
ruff check .
식별된 문제 중 상당수를 자동으로 수정하려면:
ruff check . --fix
Ruff는 특정 규칙을 시행하거나 다른 규칙을 무시하도록 pyproject.toml
또는 ruff.toml
파일을 통해 구성할 수 있습니다. 예를 들어:
# pyproject.toml [tool.ruff] line-length = 88 target-version = "py310" select = [ "E", # Error "W", # Warning "F", # Pyflakes "C90", # Complexity "I", # Isort "B", # Bandit "N", # Naming conventions "ANN", # Type annotations "UP", # Pyupgrade rules ] ignore = [ "E501", # Black이 줄 길이를 처리하므로 Ruff가 불평을 해서는 안 됩니다. "W292", # Black도 EOF의 줄 바꿈을 처리합니다. ]
Ruff의 주요 장점은 isort
및 일부 black
규칙을 처리할 수 있어 종종 isort
를 별도의 단계로 실행할 필요가 없다는 것입니다. Ruff를 사용할 때는 I
(Isort) 규칙을 활성화하고, 마이그레이션 중인 경우 다른 린터의 중복 규칙을 비활성화하도록 구성해야 합니다. 도구 체인을 더욱 통합하는 Ruff 포매터도 개발 중입니다.
5. 워크플로에 통합: 사전 커밋 후크
진정한 자동화를 위해 Git pre-commit
후크를 사용하여 버전 제어 시스템에 이러한 도구를 통합합니다. 이를 통해 포매팅되지 않거나 규칙을 위반하는 코드가 리포지토리에 도달하지 않도록 할 수 있습니다.
먼저 pre-commit
을 설치합니다.
pip install pre-commit
그런 다음 프로젝트 루트에 .pre-commit-config.yaml
파일을 만듭니다.
# .pre-commit-config.yaml repos: - repo: https://github.com/astral-sh/ruff-pre-commit # Ruff에는 Black 호환 포매팅이 포함됩니다. rev: v0.3.3 # 최신 Ruff 릴리스 사용 hooks: - id: ruff args: [--fix, --exit-non-zero-on-fix] - id: ruff-format # Ruff의 포매터를 사용하려면 (실험적) args: [] # Black 포매터를 Ruff 포매터 대신 선호하는 경우 다음을 주석 해제하십시오. # - repo: https://github.com/psf/black # rev: 24.3.0 # 최신 Black 릴리스 사용 # hooks: # - id: black # language_version: python3.10 # 프로젝트의 Python 버전에 맞게 조정
이제 후크를 설치합니다.
pre-commit install
이제부터 모든 git commit
명령은 스테이징된 파일을 포매팅하기 위해 ruff
(및 잠재적으로 black
)를 트리거합니다. 후크에 의해 파일이 수정되면 커밋이 실패하고, 포매터가 만든 변경 사항을 git add
하고 다시 커밋해야 합니다. 이 "실패 시 즉시 알림" 접근 방식은 완벽하게 포매팅된 코드베이스를 보장합니다.
결론: 쉬운 코드 품질을 향한 길
Black, Ruff 및 Isort(또는 점점 더 Ruff만)의 조합은 일관된 Python 코드 스타일을 유지하기 위한 자동화되고 객관적이며 매우 효율적인 파이프라인을 구축합니다. 포매팅에 대한 지루한 논쟁을 제거함으로써 이러한 도구는 개발자 시간을 절약하고 정신 에너지를 문제 해결 및 혁신에 집중할 수 있도록 해줍니다. 이 자동화된 일관성은 코드 가독성 및 유지 관리성을 높일 뿐만 아니라 더 협력적이고 덜 좌절감을 주는 개발 환경을 육성합니다. 이러한 도구들을 받아들이고 Python 프로젝트를 깨끗하고 일관되며 고품질 코드의 패러다임으로 전환하십시오.