본문 바로가기
데이터&AI/기타개발

파이썬!! 일관성 있게 코딩하기! (feat. Ruff linter)

by 일등박사 2025. 1. 6.
728x90

 

프로그래밍에서 일관성 있는 코드 스타일은 가독성을 높이고, 협업 시 생산성을 극대화하는 중요한 요소입니다.

특히, Python과 같은 유연한 언어에서는 코드 스타일이 엇갈리기 쉽습니다.

이번 글에서는 Python에서 일관성을 유지하며 깔끔한 코드를 작성할 수 있도록 도와주는 도구와 팁을 소개합니다.

 

1. Python 코딩 스타일의 중요성

 

Python은 PEP 8 (Python Enhancement Proposal 8)이라는 코드 스타일 가이드를 제공합니다.

이 가이드는 코드의 가독성을 높이고, Python 개발자들 사이의 통일성을 유지하는 것을 목표로 합니다. 그러나 사람마다 스타일이 다를 수 있기 때문에, 프로젝트에서 일관성을 유지하려면 자동화된 도구의 도움이 필요합니다. -

 

2. PyPI 도구 활용하기

 

Python 개발에서 유용한 스타일 도구와 라이브러리는 PyPI(Python Package Index)에서 쉽게 설치하고 사용할 수 있습니다.

다음은 일관된 코딩 스타일을 유지하는 데 유용한 몇 가지 도구입니다.

 

#1 Black

Black은 "모든 코드는 같아야 한다"는 철학을 따르는 포매터입니다. Black을 사용하면 코드 스타일을 신경 쓰지 않고도 항상 일정한 형식의 코드를 유지할 수 있습니다.

 

 pip install black 을 통해 간단히 설치하고사용할수 있지요!!

 

#2 isort

Python에서 import 정렬은 스타일에서 자주 논쟁이 되는 부분입니다.

isort는 import 문을 자동으로 정렬해주는 도구로, Black과 함께 사용하면 더욱 강력합니다.

 

#3 Flake8

Flake8은 코드의 문법 오류, 스타일 위반을 검사하는 데 유용한 도구입니다.

프로젝트의 PEP 8 준수 여부를 확인하고, 불필요한 코드나 비효율적인 코드를 감지합니다.

 

2.  이 모든걸 한번에!!Ruff Linter!! 

※ 참고 : linter란??

Linter는 프로그래밍 언어에서 코드의 문법적 오류스타일 문제를 자동으로 감지하고 분석해주는 코드 정적 분석 도구입니다. 개발자가 작성한 코드를 컴파일하거나 실행하지 않아도, 코드의 잠재적인 오류를 사전에 발견하고 개선할 수 있도록 돕습니다.

 

 

Python 코드에서 스타일을 검사하고 자동으로 문제를 해결해주는 도구 중 하나가 바로 Ruff입니다. Ruff는 속도가 매우 빠르며, Black, isort, Flake8 등의 기능을 한곳에서 제공합니다.

왜 Ruff를 써야 할까?

  • 속도: 대규모 프로젝트에서도 빠르게 동작.
  • 통합성: 여러 도구의 기능을 하나로 통합.
  • 자동 수정: 스타일 문제를 자동으로 고칠 수 있는 기능 제공.

Ruff 설치 및 사용법

pip install ruff

 

코드 검사:

## 파일명을 대상으로!!  검사하기
ruff check your_file.py

## 파일명을 대상으로!!  검사하기 & 수정하기
ruff check --fix your_file.py
 
Ruff의 장점

Ruff는 PEP 8 스타일 준수 외에도 프로젝트별 규칙을 설정할 수 있으며,

불필요한 import 정리나 코드 최적화를 한 번에 처리합니다.

특히, Flake8과 isort를 대체할 수 있어 더 간결한 워크플로를 제공합니다.

 

+ 나만의 TIP! ①

VScode, Cursor 등에서는 ruff extension 설치가 가능합니다~~

설치후에는!! 문제되는 부분을 모두 확인할 수 있어요!!

+ 나만의 TIP! ②

ruff 가 꼼꼼히 봐주지만서도,, 너무 꼼꼼히봐줘서 문제가될떄도 있는데요!

이에 저는 pyproject.toml에 아래와 같이 예외를 두고 실행합니다!!

[tool.ruff.lint]
select = ["ALL"]
ignore = [
    "ANN",          # 모든 타입 주석 경고 비활성화
    "ARG",          # 모든 함수 인수 관련 경고 비활성화
    "B007",         # 루프 제어 변수가 사용되지 않음
    "B009",         # getattr를 상수 속성 값으로 호출하지 않음
    "B011",         # False를 assert하지 않음
    "DTZ001",       # tzinfo 없이 datetime 호출
    "DTZ007",       # 시간대 없이 datetime.strptime 호출
    "DTZ011",       # date.today 호출
    "D405",         # 섹션 이름의 대문자 처리 (TODO 및 NOTE와 관련된 버그)
    "E501",         # 너무 긴 줄
    "G004",         # f-string에서 로깅 사용
    "PD013",        # pandas의 .stack 사용
    "PLR0913",      # 너무 많은 인수
    "PTH103",       # os.makedirs
    "PTH110",       # os.path.exists
    "PTH113",       # os.path.isfile
    "PTH118",       # os.path.join
    "PTH123",       # builtin-open
    "RET504",       # 불필요한 변수 할당
    "S301",         # 의심스러운 pickle 사용
    "S603",         # shell=True 없이 subprocess 실행
    "S607",         # 잘못된 경로로 프로세스 시작
    "TC002",        # typing 전용 서드파티 import
    "E402",         # import가 파일 상단에 위치하지 않음
    "E402",         # import가 파일 상단에 위치하지 않음 (중복)
    "BLE001",       # except의 세부 사항을 모른상태에서 처리하기
    "E722",         # bare except허가해주기
]

 

 

 

코딩!! 화이팅입니다!!

728x90

댓글