Python Developer Tooling Handbook logo

Python Developer Tooling Handbook

Archives
Subscribe
August 17, 2026

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, .venv copy, 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 lock prints No 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.toml snippet 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 init to create packaged projects by default, with a src/ layout and uv_build. The previous flat layout is now uv 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 import syntax from PEP 810 (up to 70% startup speedup on large codebases), a built-in frozendict type, 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:
← Newer LICENSE files in wheels, Python 3.15 rc2, and reproducible builds Older → Serverless deployment guides and a type checker comparison

Add a comment:

Posting this comment will subscribe you to this newsletter with the email address you enter.
Share this email:
Share on Twitter Share on LinkedIn
book
Twitter
LinkedIn
tdhopper.com
Powered by Buttondown, the easiest way to start and grow your newsletter.