- 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 릴리스에서 확인할 수 있음