Ruff v0.16.0 — 기본 규칙이 59개에서 413개로 대폭 확대
요약
Python 린터 및 포매터인 Ruff v0.16.0이 출시되었습니다. 기본 활성화 규칙이 59개에서 413개로 대폭 확대되었으며, Markdown 내 Python 코드 블록 포매팅 기능이 새롭게 추가되었습니다.
핵심 포인트
- 기본 활성화 규칙이 413개로 확대되어 심각한 오류 탐지 능력 강화
- Markdown 파일 내 Python 코드 블록 포매팅 지원 (Quarto 포함)
- ruff: ignore, ruff: file-ignore 등 새로운 진단 억제 주석 추가
- JSON 출력 형식 변경에 따른 기존 자동화 도구 영향 확인 필요
- Rust로 작성된 Python 린터·포매터
Ruff v0.16.0은 기본 활성화 규칙을 59개에서 413개로 늘려, 별도 설정 없이 구문 오류와 즉시 발생하는 런타임 오류를 더 폭넓게 탐지함 - Markdown에서
python
, py
, pyi
, pycon
등으로 표시된 Python 코드 블록 포매팅을 지원하며 Quarto 노트북에도 적용 가능함
ruff: ignore
와 ruff: file-ignore
가 추가돼 논리적 코드 행이나 파일 전체의 진단을 억제할 수 있고, --add-ignore
로 주석을 자동 삽입할 수 있음
check
와 format --check
는 수정 내용을 기본 진단 아래 diff로 표시하며, 포매터 검사도 JSON과 GitHub·GitLab CI 주석용 출력 형식을 지원함
- 대부분은 큰 변경 없이 업그레이드할 수 있지만, 늘어난 기본 규칙과 일부 값이
null
이 될 수 있는 JSON 출력 변경이 기존 설정과 자동화 도구에 미치는 영향을 확인해야 함
기본 규칙 413개로 확대
- Ruff v0.16.0은 Rust로 작성된 고속 Python 린터·포매터로, PyPI 또는
uv tool install ruff@latest
로 설치할 수 있음
- Ruff의 전체 규칙은 v0.1.0 당시 708개에서 968개로 늘었지만, 기본 활성화 규칙은 그동안 59개로 유지돼 왔음
- v0.16은 기본 규칙을
413개로 확대해 구문 오류와 즉시 발생하는 런타임 오류를 포함한 심각한 문제를 별도 설정 없이 탐지함 - flake8-bugbear의
B
, pyupgrade의 UP
, Ruff 자체 RUF
범주 규칙 등이 포함됨
- 전체 목록은 Default Rules 문서에서 확인할 수 있음
select
나 extend-select
를 이미 사용하는 프로젝트도 새 기본 규칙을 통해 이전에 알지 못했던 유용한 규칙을 확인할 수 있음
- 이전 기본 규칙으로 되돌리려면 다음과 같이 설정함
[lint]
select = ["E4", "E7", "E9", "F"]
- 이번 변경은 장기 과제인
규칙 재분류와 연결되며, 관련 작업도 계속 이어질 예정임
Markdown 코드 블록 포매팅
ruff format
이 Markdown 파일에 포함된 Python 펜스 코드 블록을 포매팅함
- 지원하는 정보 문자열은
python
, py
, python3
, py3
, pyi
, pycon
임
pyi
는 스텁 파일 형식으로 처리함
pycon
은 REPL 세션 형식으로 처리함
- 나머지는 일반 Python 파일처럼 포매팅함
{python}
처럼 언어 이름이 중괄호로 둘러싸여 있어도 인식하므로 Quarto 노트북에도 사용할 수 있음
.qmd
확장자를 쓴다면 extension
매핑 설정이 필요할 수 있음
- 코드 블록 내부에서는
fmt: off
와 fmt: on
으로 일부 포매팅을 억제할 수 있음
- Markdown 문서 영역 전체는
<!-- fmt: off -->
와 <!-- fmt: on -->
HTML 주석으로 제외할 수 있음
- 모든 Markdown 파일을 제외하려면
extend-exclude
에 *.md
같은 glob을 지정함
- 세부 동작은 Markdown 코드 포매팅 문서에서 확인할 수 있음
새로운 진단 억제 주석
- v0.15의
ruff: disable
·ruff: enable
범위 억제에 이어, v0.16은 ruff: ignore
와 ruff: file-ignore
를 추가함
ruff: ignore
는 noqa
처럼 같은 행의 진단을 억제하거나, 독립된 주석으로 작성해 다음 논리적 행 전체에 적용할 수 있음
- 여러 줄로 작성된 함수 헤더에서는
def
부터 콜론까지가 하나의 논리적 행으로 취급됨
ruff: file-ignore
는 ruff: noqa
처럼 파일 전체에서 지정된 진단을 억제함
- 각 억제 주석에는 규칙 코드 뒤에
적용 이유를 작성할 수 있음
--add-ignore
CLI 옵션은 필요한 ruff: ignore
주석을 자동으로 추가함
- 미리보기 모드에서는
F401
같은 코드 대신 unused-import
같은 규칙 이름도 사용할 수 있음
- 전체 주석 명세는 Ruff linter 문서에 정리돼 있음
수정 diff와 출력 형식
check
와 format
은 기존에도 --diff
를 지원했지만 일반 진단과 별도로 동작해, 수정 이유를 보여주는 진단과 함께 표시되지 않았음
- v0.16의 기본
full
출력은 가능한 린터·포매터 수정 사항을 진단 아래 diff로 표시함
format --check
도 린터가 지원하는 전체 출력 형식을 사용할 수 있음
-
기계 판독용 JSON을 생성할 수 있음
-
GitHub와 GitLab이 CI에서 주석으로 렌더링하는 형식을 출력할 수 있음
-
지원 형식은 CLI 도움말과 출력 형식 문서에서 확인할 수 있음
호환성과 안정화
- v0.16의 파괴적 변경은 소수여서 대부분은 코드나 설정을 크게 바꾸지 않고 업데이트할 수 있음
- JSON 출력의
filename
, location
, end_location
, fix.edits[].location
, fix.edits[].end_location
은 빈 문자열이나 1행 1열을 기본값으로 쓰는 대신 null
이 될 수 있음
-
현재 영향을 받는 진단은 매우 적지만 향후 규칙에서는 더 흔해질 수 있음
-
12개 규칙이 미리보기에서 안정 상태로 전환됨
-
Airflow 3 함수 시그니처 호환성
AIR303
, 저작권 고지 CPY001
, float 변환 FURB164
, 정렬된 min/max FURB192
- 컬렉션 리터럴 문자열 결합
ISC004
, 예외 처리기 밖의 예외 로깅 LOG004
, 잘못된 bool 반환형 PLE0304
- 과도한 위치 인자
PLR0917
, StopIteration 반환 PLR1708
, Union 내 None
위치 RUF036
- 클래스 딕셔너리의 annotation 접근
RUF063
, __all__
중복 항목 RUF068
- 일부 기존 규칙의
안정화된 동작도 기본 적용됨
BLE001
은 critical
, error
, exception
이외의 logging
메서드로 예외를 기록해도 억제됨
FA102
는 collections.abc
등 추가 PEP 585 호환 API를 검사함
INT001
·INT002
·INT003
은 gettext
를 builtins._
에 할당하는 등 일반적인 사용 방식도 검사함
S310
은 로컬 문자열 리터럴 바인딩을 해석해 오탐을 줄임
S508
·S509
는 최신 PySNMP의 권장 API를 지원함
UP019
는 typing.Text
뿐 아니라 typing_extensions.Text
도 인식함
- 전체 변경 사항은 GitHub 릴리스에서 확인할 수 있음
AI 자동 생성 콘텐츠
본 콘텐츠는 GeekNews의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기