What does a “normal” professional Python stack look like in 2026?
Hi! I’m trying to speedrun learning Python and its ecosystem.
I’m already a senior Node.js / TypeScript engineer, so I’m less interested in programming fundamentals and more in the things you usually only learn after working with Python professionally for a while.
I’m using AI plus courses/tutorials, but I’d love some community perspective on what people actually use in real teams.
Some areas I’m trying to understand:
uvvspip/pip-tools/ Poetry for project and dependency management- FastAPI vs Flask vs Django
- Pyright vs mypy for static type checking
- Pydantic for runtime validation/parsing
- Ruff / Black / Flake8 / isort
- pytest vs unittest
- anything else I should definitely know?
A few specific questions:
- Do Python devs actually use type hints heavily nowadays? How common is fully typed Python in professional codebases? Do teams usually run mypy/Pyright in CI, or is typing more informal/partial?
- What toolset am I most likely to encounter in an established company? For example, I like
uv, but should I expect most existing codebases to still usepip+requirements.txt, Poetry, etc.? - What would you consider “must know” ecosystem knowledge for someone joining a Python team? Not necessarily your favorite modern stack, but the things I should recognize immediately when opening an unfamiliar repo.
- Framework-wise, what’s worth learning first? FastAPI seems very natural coming from Node, but I assume Django is still much more common in mature product companies. How much Flask should I care about?
- Any “Python-specific” practices that surprise experienced JS/TS engineers? Things like virtual environments, import/package layout, sync vs async conventions, typing culture, packaging, etc.
- What about design patterns? Is OOP (Object oriented programming) or FP (Functional Programming) more common? Does it depend on the type of application?
I’m basically trying to optimize for:
“I can join a Python team and not look completely lost in the ecosystem.”
Would love to hear what your team actually uses, especially in production.
60 comments · 93% upvoted · other discussions
uvis the clear winner here, feature-wise. It has the fastest dependency resolution/download, and it also both manages Python versions for you (meaning you don't needpyenvor manual Python installations) and has a growing number of handy features, likeuv audit(meaning you don't need tools likepip-auditfor auditing your dependencies).The others simply don't even compare, though Poetry is the closest.
Depends entirely on what your goals are, no clear winner. I like to use FastAPI by default unless I have specific requirements other tools work better for.
This is a toss-up, people tend to use a mix of both. There's also
tywhich is growing in popularity, and will likely eventually replace both of these, but it's still in alpha.Pydantic is great, but mostly reserved for handling API data, since you shouldn't need to clean up internal data.
Ruff, no doubt. It's all of these in one fast tool with no additional dependencies, and more.
Pytest is the industry standard,
unittestis more like a stepping stone to it or used for legacy reasons.It's definitely growing in popularity. Old projects might lack them, but you can still type them yourself using type stub files if you want to. Personally I use them everywhere, both in personal and work projects.
I can't speak for every company, but when I joined we used Poetry, and I convinced our technical lead we should switch to
uv, and we did. I'd say both are common.That depends almost entirely on which field you'd be working in. Still, can't go wrong with knowing some important bits of the standard library (like
pathlib,functools,itertools,collections).All three are in common use. FastAPI and Flask are quite similar, Django is a much bigger thing and takes longer to learn.
I'm a Python dev first, and have only really used JS/TS at my dayjob, so I don't have much insight that'd be useful to you, probably. But maybe project structuring (
srcvs flat layout) and making the project installable so you can import things in your tests like your project was any other package.Resident-Donut-4905 [OP] 15 points · Sep 2026
Thanks for the detailed response mate! Helps a ton
proverbialbunny 12 points · Sep 2026
Also PyCharm Community does pretty much all of these by default. (The community version if free.) You can create a new uv base python project with it and not have to think too much about the finer details.
Resident-Donut-4905 [OP] 3 points · Sep 2026
Worth checking too. Thx!
HommeMusical 5 points · Sep 2026
I've spent over 20 years programming in Python; I have nothing to add to the comment you are replying to, it's very good!
Fenzik 7 points · Sep 2026
These are the exact answers I would have given after 10 years working with Python professionally. Listen to this comment OP.
Maybe with only minor thing that although flask is in use, most new projects will start with FastAPI because it’s async-first.
thirdegree 2 points · Sep 2026
Yup, also 10 years professional experience and also my exact answers. Maybe with a note that while ty is in alpha, it is also imo already as good as or better than the competition (in part because it's, in addition to being a very good type checker, also an excellent lsp server that can be integrated into any decent editor).
Diapolo10 2 points · Sep 2026 · I write code for a living -- https://github.com/Diapolo10
Yeah. Basically FastAPI is great for any use-cases where you don't want to primarily serve HTML (or if you want to write the front-end in another language), Flask is better suited for Python-only websites, and Django is the "everything and the kitchen sink" batteries-included-but-highly-opinionated option you'd use if you want all the features it offers, like the admin panel.
The first two are far easier to get into, and both have good tutorials (FastAPI has its official tutorial, Flask has the Mega-Tutorial). I only briefly played around with Django years ago so frankly I don't have much to say about it tutorial-wise.
Fenzik 2 points · Sep 2026
FastAPI is fine for HTML but not super ergonomic, you need to do most of the work yourself. There’s a few frameworks like fasthx to serve htmx snippets and can be very nice, but depends entirely what you are trying to do.
Diapolo10 2 points · Sep 2026 · I write code for a living -- https://github.com/Diapolo10
Yes, I never said it can't do it, only that by default Flask is better designed with HTML in mind.
GoguGeorgescu 2 points · Sep 2026
PDM does everything uv does and a bit more, at some point uv will implement everything PDM has, but it's gonna take some time, but you can swap the dependency resolver with uv and get the best of both worlds.
Being a node guy I like my npm scripts, uv doesn't have them, yet, but PDM does.
Fenzik 1 points · Sep 2026
PDM struggles with monorepos/workspaces and is very slow. We set up our monorepo with it at work a few years ago and eventually moved to uv and never looked back.
What do you mean about npm scripts though? What does npm (and pdm) offer that isn’t covered by uv run or the native scripts entrypoint? Not a critique, genuinely wondering
GoguGeorgescu 1 points · Sep 2026
Haven't used monorepos as for workspaces I only used it once so I have limited exposure, you can tell PDM to use UV as its dependency resolver.
The project scripts table is for built binaries, if you set up a script to run main or run the api from a method inside the app programmatically like
uvicorn.run()the script is the command you run after you install your api as a wheel, if I have a script myapi that calls I to uvicorn.run(), after I build the api as a wheel and I install it on the server, I just call myapi from the cli to start the server.Manager scripts like tool.pdm.scripts are development scripts, like test, lint, watch, migrate etc. And you define what the script does.
PDM scripts are really powerful, you can call the shell, you can do composite scripts, and they run in the context of your project. It runs at the project level, not at the system level.
pdm scripts
Fenzik 1 points · Sep 2026
Ah okay so more like Poe the Poet, just, Make, etc. Indeed uv does not offer this!
Diapolo10 1 points · Sep 2026 · I write code for a living -- https://github.com/Diapolo10
If scripts are the only difference between
uvandpdmyou care about, personally I've been experimenting with usingmiselately to add Taskfile as a dependency and to then use that for scripting development tasks (as opposed to using Makefiles which I currently have, but in practice rarely ever used because they're cumbersome on Windows).I don't know how
pdmhandles script caching (if it does that at all), but for Taskfile it's both very configurable and powerful. Every task can define dependencies, so you can be sure any task run will be valid (for example your lint task can require an installation task as a dependency, so you know your project dependencies are installed before the linters run). I got introduced to Taskfile at work, and it's frankly kind of amazing, but I didn't immediately jump ship in my personal projects because then I'd need yet another thing installed on my system to do dev work.The part where
misecomes into this is that I use it for adding programs as dependencies (like specific versions ofuv,task, andcspellset in a lockfile), meaning I only need a globalmiseinstallation and everything else is project-specific. It's like a cross-platform package manager specifically for dev tools. Incidentally it also works perfectly for keeping local dev environments and CI pipelines as identical as it gets.GoguGeorgescu 1 points · Sep 2026
I know mise, I briefly present it in my python development environment training I hold internally, I looked for a tool that covers everything so PDM kinda fills all the gaps, one other main requirement was to be conda and artifactory friendly, so far PDM is the only tool to do them all so I'm sorta biased, but, I prefer it due to development time benefits.
The scripts are nice because I'm also a node guy, so they fit my mental models, I usually group my dependencies, so linting and testing have their own dev groups, and in CI, I only install the group I need per stage.
Tbh that is just dev helpers, my images need to be slim and secure, so I use distroless hardened images and I have to fallback to pip and requirements.txt in the runtime stage. Although the CI pipelines run PDM for everything else.
I looked into taskfiles but they are not portable in the way I need them, looked at a lot of them, they still had some gotchas that wouldn't work in my company, so it's makefiles or tooling that works everywhere exactly the same, long running pipelines to lint, test and build take a lot of time to run, I need a fast feedback loop locally and I don't want to remember package names, so scripts are a gift to write once and the whole company can remember, lint, test, coverage, build, that's all you need to remember. We use template projects so everyone uses the same base everywhere regardless of organization to make things simpler to debug and fix and also audit.
Diapolo10 1 points · Sep 2026 · I write code for a living -- https://github.com/Diapolo10
Would you mind elaborating on that? Because in my experience the tasks I've written have been very portable.
GoguGeorgescu 1 points · Sep 2026
Mise needs you to know toml, I needed a tool to simplify not add on top, even dagger needs you to know how to structure the tasks, so there's a lot of overhead in knowledge, there's also the case for being compact, that's why I opted out of makefiles also and kept everything in pyproject.toml.
Now that I think of it, that was also one of the top priorities on the list, no extra cruft, keep everything as minimal as possible, so PDM's scripts fully covered that gap.
Diapolo10 1 points · Sep 2026 · I write code for a living -- https://github.com/Diapolo10
Eh, that sounds a bit of a weird argument considering
pyproject.tomlfiles exist. Did you maybe mean to write that Taskfile uses YAML so you'd need to know that?On the other hand, most if not all CI pipelines use YAML for configuration so it's not like you're going to escape that either unless you don't use CI pipelines in the first place.
For anyone else coming across this discussion, I currently use this toy project to experiment with this stuff, including using Git hooks without relying on
pre-commitor Lefthook (since Taskfile enables me to configure my hooks as I wish).GoguGeorgescu 1 points · Sep 2026
Good point, but mine also stands, you need both a
mise.tomlandpyproject.tomlto achieve something you can also do with only one.In my search for minimalism, I just stopped going further than this. It's hard enough to get people out of 2012 and into 2026, add another tool on top and the friction isn't worth it.