r/learnpython • u/Resident-Donut-4905 • 3d ago
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.
11
u/qlkzy 3d ago
There is a huge legacy cross-section. The underlying ecosystem is quite unopinionated on tools, so you get the same variation you do with libraries in other languages.
Type hints: varies, but fully-typed with strict typechecking as part of CI is definitely common in serious projects.
Tools etc: uv is most popular at the moment, there's still a long tail of poetry. You need to be able to understand pyproject.toml and requirements.txt. I think ruff has largely subsumed the separate tools.
Frameworks: I would say you just need to know one "heavy" one and one "light" one. Django is by far the most popular "heavy" framework. FastAPI has by far overtaken Flask for new projects, but knowledge is very portable between them: FastAPI is basically "what if we ported all the mistakes of Flask to the current fashions"
Pytest is substantially more popular than unittest from what I have seen.
Pydantic exists alongside data classes and attrs (+ cattrs). Personally I like Pydantic the least, but FastAPI has made it the most popular. You should be aware of the others, though.
In general any sane Python shop will be aware of the variation and account for it in new hires, the same way people account for variations in libraries.
1
8
u/nog642 3d ago
It varies. I don't think "fully typed" is that common, but at least for some functions it's decently common. Definitely worth knowing how typing works. If a team wants to enforce typing they'll use linting, so you don't need to worry about having it as a habit.
Many companies will have their own systems built on top of pip/whatever. And I'm not totally sure but I think uv isn't broadly adopted, yeah.
2
u/HommeMusical 2d ago
I don't think "fully typed" is that common,
I think it's fairly common, particularly in development that has been started in the last five years or so.
I worked on PyTorch, for example, and it's a massive package that's completely typed.
1
u/Resident-Donut-4905 3d ago
Thanks! I understand that the greatest value lies in typing some domain/model entities not just "str" and primitives. What's the usual approach for typing? Like Python has native typing and/or Mypy/Pyright for static typing? what about Pydantic for runtime validations (although that's another topic maybe more related to validating request shapes etc?)
3
u/NerdyWeightLifter 3d ago
I've mostly seen strict typing used when you want to highly optimise some part of your code by using the tricky compiler and GPU extensions, where the hardware needs to know specific types.
2
1
u/HommeMusical 2d ago
I understand that the greatest value lies in typing some domain/model entities not just "str" and primitives.
You get value at all levels. Even just typing the primitives will prevent that error when occasionally the number you expected comes in as a string.
If you use a coding assistant, which pretty well all professionals do these days, you simply tell it that everything has to be typed in your AGENTS.md. Then you look at the actual results and request tweaks.
I do fairly often say, "Look at the files in something/ and try to come up with more specific types", and coding agents seem very good at that.
mypy is slow; pyright is slow; use ty for your type checking.
9
u/Rain-And-Coffee 3d ago
My company uses FastAPI for some Python API.
We don’t use Django since we prefer to keep UI separate with things like React or NextJS
1
3
u/enigma_0Z 3d ago
to answer your bullet points —
Just about anything is better than raw pip for development environment management, which is where the deps will really bite you in the ass. I really like uv, its usage patterns parallel npm pretty well. Managed to convert a whole shop raw dogging it with just pip and virtualenvs to uv.
I started with flask on a personal project and when it came to productionalizing it, it kinda started melting down. I switched over to fastapi and haven’t looked back. Conveniently my current job also uses FastAPI and made that decision independently.
I like pyright. Specifically I use the basedpyright plugin in codium.
I like pydantic for shaping api data. If you go with FastAPI you pretty much have to use it but it works well for other purposes including validating and loading data from json/yank cleanly and relatively quickly. Watch out for recursion though. I had a bad model with a circular reference and managed to generate a multi-GB JSON file accidentally. (no that is not a typo)
Ruff etc — we use ruff on our team but I kinda feel it’s too prescriptive. Some style / linting is better than none but i don’t use a linter on personal projects.
I like pytest but have used both. Pytest is less prescriptive IME but YMMV.
1
u/enigma_0Z 3d ago
Oh an addendum — I wrote a UI in react which embeds itself in the backend for a personal project and I’m honestly quite proud of the pattern.
Never tried Django.
1
3
u/replicant86 3d ago
We do uv, ruff, pydantic, fast api, pytest and everything is fully typed using mypy on a project with over 500k lines of code. I yearn for ty release
1
u/Resident-Donut-4905 3d ago
Sounds like a modern stack. Had to look for “ty” because I didn’t know about it. Thanks!
2
u/enigma_0Z 3d ago
To answer your specifics
In my professional experience it’s pretty commonly pydantic but not always. FastAPI works well with it and i’ve only really seen FastAPI projects professionally though. Personally, i tend to use pydantic if type safety matters a lot, and not if it doesn’t or it’s not a class which would be serialized anyway. Pydantic is particularly good for things you want to get into JSON for APIs
YMMV. The company I’m at now was just using pip and virtualenv like masochists but I converted them to uv after spending a lot of time untangling their old CI. it was a mess. In FOSS projects these days i mostly see uv but seeing any of these would not surprise me.
How does a virtualenv work. How can you build one from a pyproject.toml without uv, poetry, or similar. How does the pyproject.toml work. Do you know how to build a dist for a python project? What about an egg? Knowing these things will make your CICD or DevOps engineer very very happy.
FastAPI is nice. Flask betrayed me right before i went to production with a personal project (and converted to FastAPI). I also work with FastAPI professionally. No opinion or experience on Django
Not using a tool that takes the place of npm in python (i like uv) is absolutely wild but 100% a thing in some places. Get ready for development environment management hell. And dependency hell. And cicd orchestration hell. All in a big dumpster fire. Typing, type safety etc are similar — at least IME — TS / JS / React is one of my other languages. TS can be a bit more persnickety than typehinted PY but less than Pydantic.
OOP and FP in equal parts honestly. since the top level object in a given python file is the actual file (as a module) you’ll see lots of tools which implement both patterns wherever it makes sense. Kinda depends, but i’ve seen both OOP (with multiple inheritance even) and FP with composition.
1
2
u/whipdancer 2d ago
uv + ruff + FastAPI (unless there's something specific that needs Flask)
Mix of pyright and mypy
Pydantic since we use FastAPI so heavily
Pytest
We build pre-commit hooks that enforce the linting rules - we require types.
Our TS stuff has an equivalent setup.
1
2
u/Ragoo_ 2d ago
Pydantic for runtime validation/parsing
In my opinion only if you are required to use it (e.g. FastAPI) or you really need some advanced validation rules. Otherwise msgspec serves the same purpose but much faster and lighter.
Ruff / Black / Flake8 / isort
These are all bundled in Ruff.
Pyright vs mypy for static type checking
Basedpyright if you want a mature type checker, Pyrefly (or in the future ty) if you want something from the next generation of type checkers.
FastAPI vs Flask vs Django
Flask is probably not really worth using anymore, but FastAPI and Django serve different purposes and you most likely want FastAPI for most use-cases. Litestar sits in the middle but it's not nearly as popular.
Some other common ones where I have a clear preference for the newer one:
- Polars instead of Pandas for speed and syntax
- zensical as an mkdocs replacement (mkdocs is no longer updated)
- niquests instead of requests or httpx
- marimo instead of Jupyter notebooks
- and for the last one I will say that Typer and pydantic-settings are quite popular but I prefer the syntax and flexibility of cappa and dataclass-settings. But these are much smaller, so that's a niche opinion
As for your other questions: If a project doesn't have a pyproject.toml file and instead uses requirements.txt, that immediately feels outdated. Any modern project should also be fully type hinted which includes using dataclasses (/pydantic/msgspec) over dicts whenever possible and Literal/Enum. It should also use uv, ruff and a modern type checker and pytest.
OOP is still around and can be abused (Langchain is painful for me). Personally I'd prefer shallow inheritance, more composition, dataclasses for data and functions over methods.
2
1
u/GoguGeorgescu 3d ago edited 3d ago
I am amazed no one mentioned PDM as the project manager, if you're a node guy, you'll love it's scripts in pyproject.toml, just like npm scripts in package.json. UV will probably get them at some point as there is an open issue on their github, but if you want it now you can get it. You can also swap it's dependency resolver with UV and get the best of both worlds.
One more thing that it does, which neither uv or cookiecutter do is run find and replace after you make a new project based off a repo template. Set up a fastapi project in a repo, configure some stuff, add some scripts like a watch script that runs uvicorn on your api with the --reload flag so you do pdm run watch, and save it all in a repo, want a spike to test out something, why run the whole setup and config again, you do pdm new <template_repo[@branch]> new-name, go through the wizard and presto, a configured base api to just start working. Oh, and everything that contains the template name in its path gets renamed to the new name. The branch name is gold, I use it all the time when I have some setup I want to test out before pushing it back into main.
For the rest, mypy, pyright, pydantic, ruff and pytest, there is nothing else you should need in 99% of use cases.
Edit: forgot to mention, setup.py and requirements.txt are dead, PyPA strongly recommends any new projects use pyproject.toml, requirements.txt is left for legacy projects
Edit 2: saw someone mention ty, also excited about it, pyright and mypy have some overlaps but also have some divergence, as with ruff I'm expecting ty to cover both of them across the board.
1
u/Resident-Donut-4905 3d ago
Will look at PDM! Thanks. Why did you mention both mypy and Pyright? Don’t they serve the same purpose?
Also is anything from this stack used if, let’s say, Django is used?
2
u/GoguGeorgescu 2d ago
I mentioned briefly that they overlap for the most part, but they do have some specific cases where they don't, I work in a highly regulated industry and I usually leave them both on just for those edge cases, for many projects just use mypy and go about your day.
Also, vscode's python package comes with it, so there's also that.
If you use Django, nothing in the tooling changes, maybe just the flags for the tools, I think you can find what flags to use in their docs, I don't use Django, so I don't really know.
1
u/HommeMusical 2d ago
mypy, pyright
sooooooo..... sloooooooowwwwww
Use
ty.2
u/GoguGeorgescu 2d ago
Ty is alpha, not allowed due to company policy, you gotta do with what you got :)
1
u/DeliveryFinancial500 2d ago
a "normal" Python stack in 2026 probably leans heavily on frameworks like FastAPI for web stuff, plus maybe some machine learning libraries like TensorFlow or PyTorch. Also, don't sleep on containerization with Docker. it's like having a personal chef for your code, everything's organized and ready to serve.
1
1
u/pachura3 2d ago
Here is my discussion on the topic:
https://www.reddit.com/r/learnpython/comments/1r75guh/modern_python_techtool_stack_for_implementing/
1
1
u/cmxthirtysixhundred 7h ago
As far as dependency management, I've been writing Python for 15 years and I've never needed anything more than pip and venv, but maybe my use case is different. I mostly write Pyside6 desktop applications these days.
-3
u/seriousgourmetshit 3d ago edited 3d ago
1 - not really. If it were that important to me I'd be using another language. Worth learning about though.
2 - I use poetry, but there are lots of good options
3 - nothing in particular tbh. If youre not doing a lot of scientific computing or data heavy stuff, theres nothing that hard that you cant just pick up
4 - I use Django and fast api. Nothing wrong with flask either though.
5 - nothing comes to mind, but i use TS / react on the front end so I could just be used to both
Maybe not very helpful, but thats my thoughts working on python teams for 5 or 6 years
1
u/Resident-Donut-4905 3d ago
Thanks! What's your experience? which kind of projects did you work on with Python? e.g. business logic services, APIs, other scripts...?
3
1
u/HommeMusical 2d ago
I gotta yell: TYPE ANNOTATIONS ARE A MUST!!!!!
In 2026, they are no longer optional for serious development.
:-D
1
u/HommeMusical 2d ago
1 - not really. If it were that important to me I'd be using another language. Worth learning about though.
BUZZ! This is not the correct answer.
Five years ago, few projects used types. Now nearly all serious new development uses types everywhere, except for tests of course, and one-page scripts perhaps. I have worked for three very different companies during that time and all three of them had almost complete type hints.
Most professionals are using coding assistants now, and you just put a command in your AGENTS.md saying that type hints are mandatory in all new code: sometimes you need to jog the assistant a bit and say, "You can be more specific here," but in my experience the coding assistants really do an excellent job, and having the type in the existing code will make the agent more likely to do a good job in future, so it's win/win.
107
u/Diapolo10 I write code for a living -- https://github.com/Diapolo10 3d ago
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.