1. Languages where people put a lot of effort into implementing bespoke support inside Emacs itself (as Elisp packages)
2. Languages where no one bothered to make Emacs-specific features, but are now supported quite well via LSP
Python seems to be in the #1 camp, and that seems to be what you describe.
The #2 camp, however, is superior in my experience, so I would suggest trying that instead.
I haven't worked that much with Python for a while, but at one point I used lsp-mode and pyls and it seemed pretty good: https://emacs-lsp.github.io/lsp-mode/page/lsp-pyls/
You can also choose Microsoft's Python LSP server instead: https://emacs-lsp.github.io/lsp-python-ms/