As a TypeScript developer you rely on a predictable set of tools: npm manages packages, eslint catches mistakes, prettier enforces formatting, tsc type-checks, and jest runs tests. Each tool has one job, and they compose cleanly.
Python’s toolchain grew more organically. For years every concern — package management, virtual environments, formatting, linting, type-checking, testing — had multiple competing options. That fragmentation is the first thing that surprises developers coming from Node.
The good news: the ecosystem is consolidating fast. The table below maps each Node/TS tool to its Python counterpart, old and new.
In Node, each project gets its own node_modules folder automatically. Python installs packages into a single global site-packages directory by default. Without a virtual environment, every project on your machine shares the same package versions — one upgrade can break another project.
Virtual environments (venv) solve this by creating a local, isolated Python + pip per project. You will never skip this step in professional Python work.
Run this in your terminal:
Terminal window
python3-mvenv.venv# create isolated env
source.venv/bin/activate# activate it (macOS/Linux)
The current community direction is to use two tools that together cover what previously required five:
Concern
Classic
Modern
Lint
flake8 + isort
ruff check
Format
black
ruff format
Fast package install
pip
uv pip install
Project + venv management
poetry
uv
Both ruff and uv are written in Rust and are 10–100× faster than their predecessors, per Astral’s own benchmarks (ruff, uv). If you are starting a new project today, reach for them first.