Ruff 0.16.0 enables 413 rules by default, plus Docker and ty tutorials
Ruff 0.16.0 enables 413 rules by default, plus Docker and ty tutorials
Ruff 0.16.0 expanded its default ruleset from 59 rules to 413, a 7x jump. If your project uses Ruff and hasn't upgraded, the next ruff check will flag things it was silently skipping.
New on the handbook
- Build a production Docker image for a uv project Four optimizations (multi-stage build, layer caching,
.venvcopy, bytecode compilation) cut a FastAPI container from 306 MB to 223 MB and make rebuilds finish in seconds. Starts from a working uv project and ends with a production-ready Dockerfile.
- Set up type checking for a Python project with ty Installs ty into a uv project, plants three bugs a test suite would miss, then shows what ty catches and how to tune rule levels in
pyproject.toml. Covers installation through suppression comments.
- Fix ModuleNotFoundError: No module named 'package' One diagnostic command identifies which of five causes broke the import: wrong Python, wrong environment, Jupyter kernel mismatch, or VS Code interpreter mismatch. Each cause has a fix.
- Debug uv dependency resolution failures When
uv lockprintsNo solution found, this how-to walks through reading the conflict chain, inverting the dependency tree to find the responsible package, and applying overrides or constraints to unblock resolution.
From the blog
- Ruff 0.16.0 Enables 7x More Rules by Default A breakdown of every new category now on by default, including bugbear, pyupgrade, simplify, pylint, and more, with a
pyproject.tomlsnippet to freeze the old selection for incremental upgrades.
- uv's Malware Check: What It Blocks and What It Misses uv added install-time malware scanning. The post covers what signals it checks for, what it cannot detect, and why it doesn't replace a lockfile.
In the ecosystem
- uv 0.12.0 changed
uv initto create packaged projects by default, with asrc/layout anduv_build. The previous flat layout is nowuv init --no-package. If you script project creation, update your commands. Release notes
- Python 3.15.0rc1 shipped August 4; final release targets October. Headline features:
lazy importsyntax from PEP 810 (up to 70% startup speedup on large codebases), a built-infrozendicttype, and the Tachyon statistical profiler. What's new in 3.15
- mypy 2.3 dropped Python 3.9 support for running mypy itself and now respects
__new__()return-type annotations that earlier versions ignored. Code targeting 3.9 still works with--python-version 3.9. Changelog
One thing worth trying
Load a .env file without installing python-dotenv:
uv run --env-file .env python script.py
uv run injects variables from .env before Python starts, so os.environ sees them immediately. Pass the flag multiple times to layer files; later files override earlier ones. Set UV_ENV_FILE=.env in your shell to skip the flag on every run.
Python Developer Tooling Handbook
This handbook is free, independent, and ad-free. If it saves you time, sponsor it on GitHub.
You can reply to this email. I read every response.
Don't miss what's next. Subscribe to Python Developer Tooling Handbook:
Share this email:
Add a comment: