It took me a long time but I finally understand that "python" isn't a language, "python" is a superposition of a dozen or so different languages.
For success with "python" you have to be ultra careful with ensuring that if the person who wrote the script used "python 3.9" that you also run it with "python 3.9" - if you don't you will be faced with hundreds of exceptions that have no relation to actual reality.
Never rely on distro packaging, always build from source. Use venvs liberally.
I still don't fully understand why if I have python 3.11 and I run something written in python 3.10 that it will just randomly throw exceptions...why seemingly minor versions seem to be completely incompatible,,,but I have grown to accept that it's just better to not question such things.
@sarahjamielewis Python predates and doesn't follow SemVer.
Breaking changes are allowed in minor releases, but only after issuing deprecation warnings for at least two versions. So for something to be removed in 3.11, it should have been deprecated in 3.9 or earlier, and will have given warnings when written in 3.10.
https://docs.python.org/3/faq/general.html#how-does-the-python-version-numbering-scheme-work
https://devguide.python.org/developer-workflow/development-cycle
What are the exceptions?