| It's a fair point that Python minor version changes can and do involve removal of previously deprecated APIs, which would break old code that used those APIs. That said, when I look through the 3.11 release notes you refer to, I see basically three categories of such changes: - Items that were deprecated very early in Python 3 development (3.2, for example). Since 3.3 was the first basically usable Python 3 version, I doubt there is much legacy Python 3 code that will be broken by these changes. - Items related to early versions of new APIs introduced in Python 3 (for example, deprecating early versions of the async APIs now that async development has settled on later ones that were found to work better). These sorts of breaking changes can be avoided by not using APIs that are basically experimental and are declared to be so (as the early async APIs were). - Items related to supporting old OSs or data formats that nobody really uses any more. So, while these are, strictly speaking, breaking changes, I still don't think that "constant breaking changes" is a good description of the general state of Python development. |