Overview
Python’s come a long way these last few years, and so have the main bits of tooling that help you scale a project. Here, I outline the predominant options from an early 2025 perspective.
Background — I work at Akkio, which is primarily a Python shop, and have a heavy focus myself on developer enablement and on making the developer workflow smooth and easy. I don’t necessarily have a lot of historical knowledge, but I have a lot of knowledge on what works now.
Philosophy
I follow a few main guidelines when it comes to “good” tooling.
- Performant. Every bit of time you’re waiting on tooling tends to be time a developer can’t go and do something else.
- Sensible defaults. You should be able to have a reasonably good experience without much configuration.
- Great editor support. Working well with prominent editors, again without too much configuration, is valuable. You don’t want to be fighting your tooling.
The Categories
Package Manager
Poetry
Poetry is
Alternatives
uv is an up-and-coming package manager from the Ruff folks that boasts great performance and a lot of emphasis from cargo, Rust’s very well-designed package manager (among other things). After it has a few more months to mature, this probably becomes our pick.
Linter
Ruff
My foremost recommendation is Ruff. Despite still being pre-v1.0, it’s mature enough for almost any project able to move to it, and the advantages are potent enough to offset most other things in my eyes.
Upsides
- Speed. It’s as fast as they promise, and goes through in milliseconds on hundreds of files.
- Comprehensiveness. Ruff supports most prominent rules from most prominent rulesets.
- Editor Tooling. We’ve never had real issues with Ruff. The VSCode extension works well.
Downsides
- Occasional Breaking Changes. We’ve run into a decent bit of churn when it comes to small formatter tweaks they make across minor versions (they are permitted to as per semver, as it’s pre-1.0). Consider pinning to a minor version.
Alternatives
Ruff is honestly the clear leader. There’s a reason everyone’s talking about it. However, if you’re looking for other options, you should probably check out Pylint,
Formatter
Enforcing a consistent code style gets you out of a lot of bikeshedding, cuts down on a lot of useless diff noise in PRs (especially for things like import order, if you enforce it via something like isort
), and makes it so you can get right to the content.
Ruff
My foremost recommendation is, again, Ruff.
Alternatives
Black is the canonical and still great decision, but Ruff gets you basically the same thing in a strictly more performant fashion, and takes great pains to diverge from Black as little as possible.
Type Checker
A type checker is the lifeblood of how you scale a Python app without constantly reintroducing bugs. It doesn’t help with logic errors, but it helps with a great deal of other “stupid” error classes like types.
Pyright
Specifically, basedpyright, which has various improvements and notably implements support for many things otherwise only supported editor-side via Pylance.
Pyright ended up being the best of the bunch for us, with primary reasons being
- Performance. It wasn’t a magnitude difference like Ruff against all the other linters, but it was noticeably faster, maybe by half.
- Editor Integration. As Pyright was built to be a LSP from the beginning, and it backs VSCode, its editor integration is rock solid. You do have to take very minor steps (which basedpyright supports out of the box) to ensure your installed
pyright
version is the same as the one VSCode is using behind the scenes, but it’s overall super smooth.
Alternatives
Mypy is the canonical type checker and was the default recommendation for a while. It’s still pretty solid, and is worth doing a deep dive on.
However, we ran into issues with:
- Performance; the daemon (
mypyd
) is their intended solution for this, but I was never able to get it working smoothly with our project structure. I only somewhat think this was a skill issue, and nest the majority of the responsibility for that with mypy. - Editor extensions didn’t work very smoothly
Editor
Good editor integration and smooth setup goes a long way towards keeping your devs productive.
VSCode
We standardize on VSCode.
but do not prevent people from using others like PyCharm.
Alternatives
We do not require that people use VSCode.