Ngày 9/10/2026, Astral phát hành Ruff 0.17.0 cùng ngày với uv 0.13.0. Bản này thu hẹp bộ quy tắc mặc định: 7 quy tắc bắt datetime naive thuộc nhóm DTZ không còn bật sẵn. Đồng thời, Python mặc định để lint tăng từ 3.10 lên 3.11, và file thực thi trên macOS và Windows được ký số.
Ruff là linter và formatter viết bằng Rust, gần như đã thành chuẩn mặc định trong các dự án Python mới. Astral phát hành bản minor mỗi 3 tháng, bản nào cũng mang breaking change — 0.17.0 cũng không ngoại lệ.
Bỏ cảnh báo datetime naive khỏi bộ mặc định
Bảy quy tắc flake8-datetimez — DTZ001, DTZ005, DTZ006, DTZ007, DTZ011, DTZ012 và DTZ901 — không còn bật sẵn. Đây là nhóm bắt datetime naive, tức datetime không gắn múi giờ: DTZ001 bắt datetime.datetime() thiếu tzinfo, DTZ005 bắt datetime.now() thiếu tz. Dự án dùng bộ mặc định sẽ thấy các cảnh báo này biến mất sau khi nâng cấp. Ngược lại, F406 (lỗi cú pháp do biến local chưa định nghĩa trong import * lồng nhau) nay được bật mặc định. Astral chỉ rút nhóm DTZ khỏi bộ mặc định, vì các quy tắc này gây tranh cãi. Ai muốn giữ cảnh báo thì bật lại trong pyproject.toml:
[tool.ruff.lint]extend-select = ["DTZ"]
Chuẩn Python mặc định lên 3.11
Ruff giờ lint mặc định theo Python 3.11 thay vì 3.10 khi dự án không khai target-version hay requires-python — hệ quả của việc Python 3.10 hết hỗ trợ từ 1/10/2026. Kiểm tra lỗi cú pháp thì Ruff dùng Python 3.15 thay vì 3.14. target-version khai tường minh luôn thắng phiên bản suy ra từ requires-python, nên UP040 không gợi ý sai. UP035 gợi ý typing.TypeForm trên Python 3.15.
Những thay đổi khác đáng chú ý
- File thực thi macOS và Windows được ký số: giảm cảnh báo bảo mật và false positive antivirus.
- Quy ước mới: datetime as dt là alias chuẩn (ICN001); biến dummy Unicode được nhận diện; dữ liệu Unicode 17.
- CLI luôn hiện các bản sửa unsafe trong output đầy đủ — muốn áp dụng vẫn phải opt-in.
- Bản conda-forge không còn phụ thuộc Python — python -m ruff không chạy nữa, hãy gọi ruff từ PATH. Cài qua PyPI không ảnh hưởng.
- ruff-lsp bị gỡ, VS Code luôn dùng native language server; ổn định TID254, TID255, RUF071.
Điều này có ý nghĩa gì với bạn
Đừng hiểu sự im lặng của Ruff là code đã sạch: datetime naive vẫn là nguồn lỗi múi giờ kinh điển. Nếu team bạn coi datetime naive là lỗi, hãy bật lại nhóm DTZ sau khi nâng cấp. Thứ hai, hãy khai target-version tường minh trong pyproject.toml thay vì để Ruff tự suy luận. Nếu cài Ruff qua conda-forge thì bỏ thói quen python -m ruff; nếu vẫn dùng ruff-lsp thì chuyển sang native server.
Bài viết liên quan
- Python: xử lý múi giờ đúng bằng zoneinfo — hết lỗi naive/aware
- Astral nối uv với ty: một lệnh uv check kiểm tra cả project lẫn script Python
- Python 3.15.0 ra mắt ngày 9/10: lazy import, JIT nhanh hơn, UTF-8 mặc định
Câu hỏi thường gặp
Nâng cấp lên Ruff 0.17.0, cảnh báo datetime naive biến mất — code của tôi giờ an toàn?
Không. Ruff chỉ rút nhóm DTZ khỏi bộ mặc định, datetime naive vẫn gây lỗi như thường. Muốn giữ cảnh báo, bật lại bằng extend-select = [“DTZ”].
Tôi cần sửa gì khi target-version mặc định lên 3.11?
Đã khai target-version hoặc requires-python thì không đổi gì. Nếu chưa khai, Ruff lint theo chuẩn 3.11 — tốt nhất khai tường minh trong pyproject.toml.
Cài Ruff qua conda-forge, python -m ruff báo lỗi sau khi nâng cấp?
Đúng, bản conda-forge không còn phụ thuộc Python nên python -m ruff không chạy nữa. Hãy gọi ruff trực tiếp từ PATH; cài qua PyPI không bị ảnh hưởng.
💬 Tin này ảnh hưởng tới dự án của bạn thế nào? Chia sẻ góc nhìn của bạn trong phần bình luận — mình đọc hết và sẽ tổng hợp những ý hay nhất.
Nguồn tham khảo
- Astral — Ruff 0.17.0 release notes: https://github.com/astral-sh/ruff/releases/tag/0.17.0
- Real Python — Python 3.15 Ships and Other Python News for November 2026: https://realpython.com/python-news-november-2026/
- Ruff docs — call-datetime-now-without-tzinfo (DTZ005): https://docs.astral.sh/ruff/rules/call-datetime-now-without-tzinfo/
