This is the classic trade-off between convention and configuration.
You can prefer a tech stack that values convention over configuration, while others prefer the opposite.
This is totally fine.
Python applications vary widly. Having a single standard option for packaging that is good enough for all isn't the core language goal.
with no choice comes responsibility too, it's just that neither are yours, and likely aren't what you'd want.
edit: at this time, incidentally, i'm choosing to not use the VC-backed out-of-ecosystem toolchain (ruff, uv); pipx and setuptools do just fine.
C# doesn't have this problem, for example -- though it has others. My (very brief) contact with rust crates as a user suggests that rust does; elisp/emacs absolutely does, and in spades; js might but i've never written a line so i don't know.
end of the day, python solves my business needs, so I've learned to walk the tangle. So much so that it makes sense, usually...