{"post_stream":{"posts":[{"id":100899,"name":"Victor Stinner","username":"vstinner","avatar_template":"/user_avatar/discuss.python.org/vstinner/{size}/15130_2.png","created_at":"2023-06-16T10:04:48.349Z","cooked":"\u003cp\u003eHi,\u003c/p\u003e\n\u003cp\u003eI would like to specify clearly a new \u003cstrong\u003e“soft deprecation”\u003c/strong\u003e status in \u003ca href=\"https://peps.python.org/pep-0387/\"\u003ePEP 387: Backwards Compatibility Policy\u003c/a\u003e for functions which should be avoided for new code since \u003cstrong\u003ethese functions will not be developed further\u003c/strong\u003e, but it’s ok to keep them in old code since their removal is not scheduled.\u003c/p\u003e\n\u003cp\u003eOver the least years, whenever I saw \u003cem\u003eanything\u003c/em\u003e marked as \u003cem\u003edeprecated\u003c/em\u003e for at least 2 Python releases, I eaggerly removed it \u003cem\u003eas soon as possible\u003c/em\u003e. In Python 3.13, I started to dig deeper and found many “inactive” deprecations: deprecations only in documentation or code comments: mostly invisible to users.\u003c/p\u003e\n\u003cp\u003eExample in code (ctypes):\u003c/p\u003e\n\u003cpre\u003e\u003ccode class=\"lang-auto\"\u003e# XXX Deprecated\ndef SetPointerType(pointer, cls):\n    ...\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eExample in the doc (C API), comment not visible in rendered HTML documentation:\u003c/p\u003e\n\u003cpre\u003e\u003ccode class=\"lang-auto\"\u003e.. XXX deprecated, will be removed\n.. c:function:: int PyArg_Parse(PyObject *args, const char *format, ...)\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eAnother example, I was surprised that the \u003ccode\u003eoptparse\u003c/code\u003e module got deprecated in its documentation as soon as the new shiny \u003ccode\u003eargparse\u003c/code\u003e module was added to Python 2.7, whereas the \u003ccode\u003egetopt\u003c/code\u003e was not deprecated. I like how \u003ccode\u003eoptparse\u003c/code\u003e is deprecated in the documentation:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eDeprecated since version 3.2: The optparse module is deprecated and \u003cstrong\u003ewill not be developed further\u003c/strong\u003e; development will continue with the argparse module.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eNo removal is planned. There is no urgency for users to upgrade their code to argpase. This deprecation is there since Python 2.7 (2010) and Python 3.2 (2012): for 13 years. I proposed \u003ca href=\"https://github.com/python/cpython/pull/105735\"\u003ea PR to deprecate getopt\u003c/a\u003e, but CAM doesn’t seem to fully embrace the idea of “a deprecation” (even if I don’t schedule its removal).\u003c/p\u003e\n\u003cp\u003eAnother tricky deprecation is the \u003ccode\u003ePyObject_SetAttrString(obj, attr_name, NULL)\u003c/code\u003e C API which can be used to delete an attribute, instead of using \u003ccode\u003ePyObject_SetAttrString(obj, attr_name)\u003c/code\u003e. Serhiy Storchaka explained that this API is error-prone since the 3rd argument can be NULL because a function call. See the \u003ca href=\"https://github.com/python/cpython/issues/105373\"\u003eissue\u003c/a\u003e and \u003ca href=\"https://github.com/python/cpython/pull/105374\"\u003emy PR\u003c/a\u003e discussion for details. \u003ccode\u003ePyObject_SetAttrString(obj, attr_name, NULL)\u003c/code\u003e should be deprecated, but it’s unclear how since currently it’s valid code for 30 years.\u003c/p\u003e\n\u003cp\u003eI dislike this \u003cem\u003egray area\u003c/em\u003e of things not really deprecated but still deprecated. It would be nice to have a well defined status “deprecated with no plan to remove it” in PEP 387. It doesn’t mean that this function can no be removed anymore. It’s a way to announce to users that they should avoid it for new code, it’s ok continuing to use it in existing code, and there is no urgency to migrate existing usage.\u003c/p\u003e\n\u003cp\u003eDeprecation is usually implemented at different places:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eJust a sentence in the documentation without markup\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e.. deprecated:: 3.x\u003c/code\u003e markup in the documentation\u003c/li\u003e\n\u003cli\u003eJust a sentence in the function docstring\u003c/li\u003e\n\u003cli\u003eDeprecationWarning emitted in the code\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eI propose to define a “soft deprecation”:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e.. deprecated::\u003c/code\u003e markup in the documentation, or maybe (better?) a new \u003ccode\u003e.. soft-deprecated::\u003c/code\u003e markup in the documentation (which would link to what it means in details)?\u003c/li\u003e\n\u003cli\u003eEmit PendingDeprecation in the code\u003c/li\u003e\n\u003cli\u003eMaybe be explicit that it’s “soft deprecation” and that the feature is not scheduled for removal\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eFor me, each deprecation change should require a new discussion:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003enot deprecated =\u0026gt; soft deprecation: it should only impact users who check for warnings in tests, but PendingDeprecationWarning is safe to ignore, no?\u003c/li\u003e\n\u003cli\u003esoft deprecation (PendingDepecationWarning) =\u0026gt; “hard” deprecation (DeprecationWarning): so far, all “hard” deprecations that I saw were always be followed by removal. So we must think ahead: how to have a smooth migration plan, how to write\u003c/li\u003e\n\u003cli\u003e“hard” deprecation =\u0026gt; removal (usually, this one is easy, but not always)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eToday, the most common case is to move from “not deprecated” to “hard” deprecation immediately. IMO it’s fine for most cases, especially when the code is known be error-prone, caused security vulnerabilities, is rarely used, etc.\u003c/p\u003e\n\u003cp\u003eAt each status change, we should investigate how the code is used in CPython itself (remember asyncore/asynchat or imp module in the Python stdlib and test suite!), in PyPI top 5,000 projects, look for usage in the Internet (code search, questions on forums, etc.), check also for issues in the Python bug tracker, etc. It’s not because a function is still widely used that i cannot be removed. It should be a consensus.\u003c/p\u003e\n\u003cp\u003eWhat do you think? Should we keep this “gray area”? Is it worth it to specify a “soft deprecation”?\u003c/p\u003e\n\u003cp\u003eSee also my issue: \u003ca href=\"https://github.com/python/cpython/issues/105373\"\u003eKeep deprecated functions in Python 3.13: remove this deprecation\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eVictor\u003c/p\u003e","post_number":1,"post_type":1,"posts_count":83,"updated_at":"2023-06-16T10:04:48.349Z","reply_count":2,"reply_to_post_number":null,"quote_count":0,"incoming_link_count":2887,"reads":211,"readers_count":210,"score":14557.2,"yours":false,"topic_id":27957,"topic_slug":"formalize-the-concept-of-soft-deprecation-dont-schedule-removal-in-pep-387-backwards-compatibility-policy","display_username":"Victor Stinner","primary_group_name":"committers","flair_name":"committers","flair_url":"https://us1.discourse-cdn.com/flex002/uploads/python1/original/1X/ca0883b21b8210c5a62c9ac02353de5f24a4d6fc.png","flair_bg_color":"006b94","flair_color":"fac731","flair_group_id":41,"badges_granted":[],"version":1,"can_edit":false,"can_delete":false,"can_recover":false,"can_see_hidden_post":false,"can_wiki":false,"link_counts":[{"url":"https://peps.python.org/pep-0387/","internal":false,"reflection":false,"title":"PEP 387 – Backwards Compatibility Policy | peps.python.org","clicks":101},{"url":"https://github.com/python/cpython/issues/105373","internal":false,"reflection":false,"title":"Keep deprecated functions in Python 3.13: remove this deprecation · Issue #105373 · python/cpython · GitHub","clicks":32},{"url":"https://github.com/python/cpython/pull/105735","internal":false,"reflection":false,"title":"Deprecate the getopt module in its documentation by vstinner · Pull Request #105735 · python/cpython · GitHub","clicks":31},{"url":"https://github.com/python/cpython/pull/105374","internal":false,"reflection":false,"title":"gh-105373: PyObject_SetAttr(NULL) is no longer deprecated by vstinner · Pull Request #105374 · python/cpython · GitHub","clicks":7},{"url":"https://discuss.python.org/t/logging-attributes-standardization/29267/5","internal":true,"reflection":true,"title":"Logging attributes standardization","clicks":0}],"read":true,"user_title":"CPython core developer","title_is_group":true,"bookmarked":false,"actions_summary":[{"id":2,"count":6}],"moderator":false,"admin":false,"staff":false,"user_id":13,"hidden":false,"trust_level":3,"deleted_at":null,"user_deleted":false,"edit_reason":null,"can_view_edit_history":true,"wiki":false,"post_url":"/t/formalize-the-concept-of-soft-deprecation-dont-schedule-removal-in-pep-387-backwards-compatibility-policy/27957/1","can_accept_answer":false,"can_unaccept_answer":false,"accepted_answer":false,"topic_accepted_answer":null,"can_vote":false},{"id":100909,"name":"Jean Abou Samra","username":"jeanas","avatar_template":"/user_avatar/discuss.python.org/jeanas/{size}/8115_2.png","created_at":"2023-06-16T10:45:43.275Z","cooked":"\u003cp\u003eI like the concept of “soft deprecating”, but please don’t use \u003ccode\u003ePendingDeprecationWarning\u003c/code\u003e for it.\u003c/p\u003e\n\u003cp\u003eAs a project maintainer, I want to easily distinguish between “my code will break in 2 releases, I must fix it now” and “my code uses soft deprecated APIs, it could be a good idea to update it”. Why not a third warning type, \u003ccode\u003eSoftDeprecationWarning\u003c/code\u003e (bikeshed: \u003ccode\u003eDiscouragedWarning\u003c/code\u003e?).\u003c/p\u003e","post_number":2,"post_type":1,"posts_count":83,"updated_at":"2023-06-16T10:45:43.275Z","reply_count":3,"reply_to_post_number":null,"quote_count":0,"incoming_link_count":2,"reads":165,"readers_count":164,"score":118.0,"yours":false,"topic_id":27957,"topic_slug":"formalize-the-concept-of-soft-deprecation-dont-schedule-removal-in-pep-387-backwards-compatibility-policy","display_username":"Jean Abou Samra","primary_group_name":null,"flair_name":null,"flair_url":null,"flair_bg_color":null,"flair_color":null,"flair_group_id":null,"badges_granted":[],"version":1,"can_edit":false,"can_delete":false,"can_recover":false,"can_see_hidden_post":false,"can_wiki":false,"read":true,"user_title":null,"bookmarked":false,"actions_summary":[{"id":2,"count":4}],"moderator":false,"admin":false,"staff":false,"user_id":3079,"hidden":false,"trust_level":2,"deleted_at":null,"user_deleted":false,"edit_reason":null,"can_view_edit_history":true,"wiki":false,"post_url":"/t/formalize-the-concept-of-soft-deprecation-dont-schedule-removal-in-pep-387-backwards-compatibility-policy/27957/2","can_accept_answer":false,"can_unaccept_answer":false,"accepted_answer":false,"topic_accepted_answer":null},{"id":100910,"name":"Victor Stinner","username":"vstinner","avatar_template":"/user_avatar/discuss.python.org/vstinner/{size}/15130_2.png","created_at":"2023-06-16T10:48:13.758Z","cooked":"\u003caside class=\"quote no-group\" data-username=\"jeanas\" data-post=\"2\" data-topic=\"27957\"\u003e\n\u003cdiv class=\"title\"\u003e\n\u003cdiv class=\"quote-controls\"\u003e\u003c/div\u003e\n\u003cimg loading=\"lazy\" alt=\"\" width=\"24\" height=\"24\" src=\"https://sea2.discourse-cdn.com/flex016/user_avatar/discuss.python.org/jeanas/48/8115_2.png\" class=\"avatar\"\u003e Jean Abou Samra:\u003c/div\u003e\n\u003cblockquote\u003e\n\u003cp\u003eI like the concept of “soft deprecating”, but please don’t use \u003ccode\u003ePendingDeprecationWarning\u003c/code\u003e for it.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/aside\u003e\n\u003cp\u003eI noticed that more and more projects are broken when a new warning is emitted by Python stdlib, since they treat warnings as errors in their test suite.\u003c/p\u003e\n\u003cp\u003eMaybe the whole concept of PendingDeprecationWarning doesn’t work in practice, or users have to learn… how to ignore them?\u003c/p\u003e\n\u003cp\u003eI’m fine with not emitting any new warning and only implementing the soft deprecation with… documentation, that’s it.\u003c/p\u003e","post_number":3,"post_type":1,"posts_count":83,"updated_at":"2023-06-16T10:48:13.758Z","reply_count":1,"reply_to_post_number":2,"quote_count":1,"incoming_link_count":0,"reads":164,"readers_count":163,"score":52.8,"yours":false,"topic_id":27957,"topic_slug":"formalize-the-concept-of-soft-deprecation-dont-schedule-removal-in-pep-387-backwards-compatibility-policy","display_username":"Victor Stinner","primary_group_name":"committers","flair_name":"committers","flair_url":"https://us1.discourse-cdn.com/flex002/uploads/python1/original/1X/ca0883b21b8210c5a62c9ac02353de5f24a4d6fc.png","flair_bg_color":"006b94","flair_color":"fac731","flair_group_id":41,"badges_granted":[],"version":1,"can_edit":false,"can_delete":false,"can_recover":false,"can_see_hidden_post":false,"can_wiki":false,"read":true,"user_title":"CPython core developer","title_is_group":true,"bookmarked":false,"actions_summary":[{"id":2,"count":1}],"moderator":false,"admin":false,"staff":false,"user_id":13,"hidden":false,"trust_level":3,"deleted_at":null,"user_deleted":false,"edit_reason":null,"can_view_edit_history":true,"wiki":false,"post_url":"/t/formalize-the-concept-of-soft-deprecation-dont-schedule-removal-in-pep-387-backwards-compatibility-policy/27957/3","can_accept_answer":false,"can_unaccept_answer":false,"accepted_answer":false,"topic_accepted_answer":null},{"id":100914,"name":"Sebastian Rittau","username":"srittau","avatar_template":"/user_avatar/discuss.python.org/srittau/{size}/237_2.png","created_at":"2023-06-16T10:57:46.607Z","cooked":"\u003caside class=\"quote group-committers\" data-username=\"vstinner\" data-post=\"3\" data-topic=\"27957\"\u003e\n\u003cdiv class=\"title\"\u003e\n\u003cdiv class=\"quote-controls\"\u003e\u003c/div\u003e\n\u003cimg loading=\"lazy\" alt=\"\" width=\"24\" height=\"24\" src=\"https://sea2.discourse-cdn.com/flex016/user_avatar/discuss.python.org/vstinner/48/15130_2.png\" class=\"avatar\"\u003e Victor Stinner:\u003c/div\u003e\n\u003cblockquote\u003e\n\u003cp\u003eI noticed that more and more projects are broken when a new warning is emitted by Python stdlib, since they treat warnings as errors in their test suite.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/aside\u003e\n\u003cp\u003eAs a maintainer of libraries, I explicitly want this behavior. I \u003cem\u003ewant\u003c/em\u003e to be notified as soon as something gets deprecated, even for soft deprecations. This keeps me up to date. I always have the option (and use) the ability to file an issue and selectively ignore warnings in my tests fairly easily.\u003c/p\u003e","post_number":4,"post_type":1,"posts_count":83,"updated_at":"2023-06-16T10:57:46.607Z","reply_count":0,"reply_to_post_number":3,"quote_count":1,"incoming_link_count":0,"reads":163,"readers_count":162,"score":152.6,"yours":false,"topic_id":27957,"topic_slug":"formalize-the-concept-of-soft-deprecation-dont-schedule-removal-in-pep-387-backwards-compatibility-policy","display_username":"Sebastian Rittau","primary_group_name":null,"flair_name":null,"flair_url":null,"flair_bg_color":null,"flair_color":null,"flair_group_id":null,"badges_granted":[],"version":1,"can_edit":false,"can_delete":false,"can_recover":false,"can_see_hidden_post":false,"can_wiki":false,"read":true,"user_title":null,"bookmarked":false,"actions_summary":[{"id":2,"count":6}],"moderator":false,"admin":false,"staff":false,"user_id":188,"hidden":false,"trust_level":2,"deleted_at":null,"user_deleted":false,"edit_reason":null,"can_view_edit_history":true,"wiki":false,"post_url":"/t/formalize-the-concept-of-soft-deprecation-dont-schedule-removal-in-pep-387-backwards-compatibility-policy/27957/4","can_accept_answer":false,"can_unaccept_answer":false,"accepted_answer":false,"topic_accepted_answer":null},{"id":100920,"name":"Paul Moore","username":"pf_moore","avatar_template":"/user_avatar/discuss.python.org/pf_moore/{size}/35_2.png","created_at":"2023-06-16T11:24:27.258Z","cooked":"\u003caside class=\"quote no-group\" data-username=\"jeanas\" data-post=\"2\" data-topic=\"27957\"\u003e\n\u003cdiv class=\"title\"\u003e\n\u003cdiv class=\"quote-controls\"\u003e\u003c/div\u003e\n\u003cimg loading=\"lazy\" alt=\"\" width=\"24\" height=\"24\" src=\"https://sea2.discourse-cdn.com/flex016/user_avatar/discuss.python.org/jeanas/48/8115_2.png\" class=\"avatar\"\u003e Jean Abou Samra:\u003c/div\u003e\n\u003cblockquote\u003e\n\u003cp\u003eI like the concept of “soft deprecating”, but please don’t use \u003ccode\u003ePendingDeprecationWarning\u003c/code\u003e for it.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/aside\u003e\n\u003cp\u003eAgreed. I don’t think soft deprecations should emit \u003cem\u003eany\u003c/em\u003e sort of warning, they should be “documentation only”.\u003c/p\u003e\n\u003cp\u003ePip uses optparse. We cannot change to argparse, because it doesn’t support some CLI syntaxes that we use (don’t ask me what, I can’t recall). We have talked about switching to a more modern CLI parser like click, but it would be a significant job, and it’s \u003cem\u003every\u003c/em\u003e low on our priority list. People use pip with warnings turned into errors. We don’t necessarily like this, but they do, and we get bug reports as a result. We could of course suppress any warning that gets added, but that’s just busy-work.\u003c/p\u003e\n\u003cp\u003eAfter all, a “soft deprecation” warning \u003cem\u003eisn’t actionable\u003c/em\u003e. The end user can’t do anything, and the developer has no required timescale to make any change. So what’s the action that the warning would be prompting? The only impact of a soft deprecation is “don’t use in new projects”. But it’s not possible to determine programmatically if a use is “in a new project”, so it’s not possible to make an appropriate choice about issuing a message.\u003c/p\u003e\n\u003cp\u003eBy all means, let’s create a clear definition of what “soft deprecation”\u003csup class=\"footnote-ref\"\u003e\u003ca href=\"#footnote-100920-1\" id=\"footnote-ref-100920-1\"\u003e[1]\u003c/a\u003e\u003c/sup\u003e means. And having a standard paragraph that can be used in the docs for anything that is soft deprecated seems like a good idea, as it gives a very consistent message. But \u003cem\u003eplease\u003c/em\u003e, let’s not alter the behaviour of running code that uses features that are \u003cem\u003eonly still there to avoid breaking running code in the first place\u003c/em\u003e!\u003c/p\u003e\n\u003chr class=\"footnotes-sep\"\u003e\n\n\u003col class=\"footnotes-list\"\u003e\n\u003cli id=\"footnote-100920-1\" class=\"footnote-item\"\u003e\u003cp\u003eI don’t like that term, but let’s bikeshed later. \u003ca href=\"#footnote-ref-100920-1\" class=\"footnote-backref\"\u003e↩︎\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e","post_number":5,"post_type":1,"posts_count":83,"updated_at":"2023-06-16T11:24:27.258Z","reply_count":2,"reply_to_post_number":2,"quote_count":1,"incoming_link_count":4,"reads":156,"readers_count":155,"score":151.2,"yours":false,"topic_id":27957,"topic_slug":"formalize-the-concept-of-soft-deprecation-dont-schedule-removal-in-pep-387-backwards-compatibility-policy","display_username":"Paul Moore","primary_group_name":"committers","flair_name":"committers","flair_url":"https://us1.discourse-cdn.com/flex002/uploads/python1/original/1X/ca0883b21b8210c5a62c9ac02353de5f24a4d6fc.png","flair_bg_color":"006b94","flair_color":"fac731","flair_group_id":41,"badges_granted":[],"version":1,"can_edit":false,"can_delete":false,"can_recover":false,"can_see_hidden_post":false,"can_wiki":false,"read":true,"user_title":"CPython core developer","title_is_group":true,"bookmarked":false,"actions_summary":[{"id":2,"count":6}],"moderator":false,"admin":false,"staff":false,"user_id":35,"hidden":false,"trust_level":3,"deleted_at":null,"user_deleted":false,"edit_reason":null,"can_view_edit_history":true,"wiki":false,"post_url":"/t/formalize-the-concept-of-soft-deprecation-dont-schedule-removal-in-pep-387-backwards-compatibility-policy/27957/5","can_accept_answer":false,"can_unaccept_answer":false,"accepted_answer":false,"topic_accepted_answer":null},{"id":100927,"name":"Inada Naoki","username":"methane","avatar_template":"/user_avatar/discuss.python.org/methane/{size}/43_2.png","created_at":"2023-06-16T12:21:02.603Z","cooked":"\u003caside class=\"quote no-group\" data-username=\"jeanas\" data-post=\"2\" data-topic=\"27957\" data-full=\"true\"\u003e\n\u003cdiv class=\"title\"\u003e\n\u003cdiv class=\"quote-controls\"\u003e\u003c/div\u003e\n\u003cimg loading=\"lazy\" alt=\"\" width=\"24\" height=\"24\" src=\"https://sea2.discourse-cdn.com/flex016/user_avatar/discuss.python.org/jeanas/48/8115_2.png\" class=\"avatar\"\u003e Jean Abou Samra:\u003c/div\u003e\n\u003cblockquote\u003e\n\u003cp\u003eI like the concept of “soft deprecating”, but please don’t use \u003ccode\u003ePendingDeprecationWarning\u003c/code\u003e for it.\u003c/p\u003e\n\u003cp\u003eAs a project maintainer, I want to easily distinguish between “my code will break in 2 releases, I must fix it now” and “my code uses soft deprecated APIs, it could be a good idea to update it”. Why not a third warning type, \u003ccode\u003eSoftDeprecationWarning\u003c/code\u003e (bikeshed: \u003ccode\u003eDiscouragedWarning\u003c/code\u003e?).\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/aside\u003e\n\u003cp\u003eIf the API will be removed in two releases, it must use DeprecationWarning. not PendingDeprecationWarning.\u003c/p\u003e\n\u003cp\u003eIf we don’t use PendingDeprecatedWarning for soft deprecation, we should soft deprecate PendingDeprecationWarning.\u003c/p\u003e","post_number":6,"post_type":1,"posts_count":83,"updated_at":"2023-06-16T12:58:26.584Z","reply_count":1,"reply_to_post_number":2,"quote_count":1,"incoming_link_count":5,"reads":156,"readers_count":155,"score":106.2,"yours":false,"topic_id":27957,"topic_slug":"formalize-the-concept-of-soft-deprecation-dont-schedule-removal-in-pep-387-backwards-compatibility-policy","display_username":"Inada Naoki","primary_group_name":"committers","flair_name":"committers","flair_url":"https://us1.discourse-cdn.com/flex002/uploads/python1/original/1X/ca0883b21b8210c5a62c9ac02353de5f24a4d6fc.png","flair_bg_color":"006b94","flair_color":"fac731","flair_group_id":41,"badges_granted":[],"version":2,"can_edit":false,"can_delete":false,"can_recover":false,"can_see_hidden_post":false,"can_wiki":false,"read":true,"user_title":"CPython core developer","title_is_group":true,"bookmarked":false,"actions_summary":[{"id":2,"count":3}],"moderator":false,"admin":false,"staff":false,"user_id":42,"hidden":false,"trust_level":3,"deleted_at":null,"user_deleted":false,"edit_reason":null,"can_view_edit_history":true,"wiki":false,"post_url":"/t/formalize-the-concept-of-soft-deprecation-dont-schedule-removal-in-pep-387-backwards-compatibility-policy/27957/6","can_accept_answer":false,"can_unaccept_answer":false,"accepted_answer":false,"topic_accepted_answer":null},{"id":100934,"name":"Victor Stinner","username":"vstinner","avatar_template":"/user_avatar/discuss.python.org/vstinner/{size}/15130_2.png","created_at":"2023-06-16T13:12:40.960Z","cooked":"\u003caside class=\"quote group-committers\" data-username=\"methane\" data-post=\"6\" data-topic=\"27957\"\u003e\n\u003cdiv class=\"title\"\u003e\n\u003cdiv class=\"quote-controls\"\u003e\u003c/div\u003e\n\u003cimg loading=\"lazy\" alt=\"\" width=\"24\" height=\"24\" src=\"https://sea2.discourse-cdn.com/flex016/user_avatar/discuss.python.org/methane/48/43_2.png\" class=\"avatar\"\u003e Inada Naoki:\u003c/div\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIf we don’t use PendingDeprecatedWarning for soft deprecation, we should soft deprecate PendingDeprecationWarning.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/aside\u003e\n\u003cp\u003eIn the past, I saw some “hard” deprecations being planned over 3 or more Python releases:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ePython 3.N: PendingDeprecationWarning\u003c/li\u003e\n\u003cli\u003ePython 3.N+1 and 3.N+2: DeprecationWarning\u003c/li\u003e\n\u003cli\u003ePython 3.N+3: remove the code\u003c/li\u003e\n\u003c/ul\u003e","post_number":7,"post_type":1,"posts_count":83,"updated_at":"2023-06-16T13:12:40.960Z","reply_count":0,"reply_to_post_number":6,"quote_count":1,"incoming_link_count":7,"reads":149,"readers_count":148,"score":64.8,"yours":false,"topic_id":27957,"topic_slug":"formalize-the-concept-of-soft-deprecation-dont-schedule-removal-in-pep-387-backwards-compatibility-policy","display_username":"Victor Stinner","primary_group_name":"committers","flair_name":"committers","flair_url":"https://us1.discourse-cdn.com/flex002/uploads/python1/original/1X/ca0883b21b8210c5a62c9ac02353de5f24a4d6fc.png","flair_bg_color":"006b94","flair_color":"fac731","flair_group_id":41,"badges_granted":[],"version":1,"can_edit":false,"can_delete":false,"can_recover":false,"can_see_hidden_post":false,"can_wiki":false,"read":true,"user_title":"CPython core developer","title_is_group":true,"bookmarked":false,"actions_summary":[],"moderator":false,"admin":false,"staff":false,"user_id":13,"hidden":false,"trust_level":3,"deleted_at":null,"user_deleted":false,"edit_reason":null,"can_view_edit_history":true,"wiki":false,"post_url":"/t/formalize-the-concept-of-soft-deprecation-dont-schedule-removal-in-pep-387-backwards-compatibility-policy/27957/7","can_accept_answer":false,"can_unaccept_answer":false,"accepted_answer":false,"topic_accepted_answer":null},{"id":100943,"name":"Jelle Zijlstra","username":"Jelle","avatar_template":"/user_avatar/discuss.python.org/jelle/{size}/1049_2.png","created_at":"2023-06-16T14:40:20.397Z","cooked":"\u003cp\u003eI like the idea of a soft deprecation. It would be useful for a number of objects in the \u003ccode\u003etyping\u003c/code\u003e module that are currently deprecated without an explicit removal timeline (\u003ca href=\"https://docs.python.org/3.12/library/typing.html#deprecation-timeline-of-major-features\" class=\"inline-onebox\"\u003etyping — Support for type hints — Python 3.12.0b2 documentation\u003c/a\u003e). I would also prefer not to emit any warnings for soft-deprecated features.\u003c/p\u003e","post_number":8,"post_type":1,"posts_count":83,"updated_at":"2023-06-16T14:40:20.397Z","reply_count":0,"reply_to_post_number":null,"quote_count":0,"incoming_link_count":1,"reads":151,"readers_count":150,"score":170.2,"yours":false,"topic_id":27957,"topic_slug":"formalize-the-concept-of-soft-deprecation-dont-schedule-removal-in-pep-387-backwards-compatibility-policy","display_username":"Jelle Zijlstra","primary_group_name":"committers","flair_name":"committers","flair_url":"https://us1.discourse-cdn.com/flex002/uploads/python1/original/1X/ca0883b21b8210c5a62c9ac02353de5f24a4d6fc.png","flair_bg_color":"006b94","flair_color":"fac731","flair_group_id":41,"badges_granted":[],"version":1,"can_edit":false,"can_delete":false,"can_recover":false,"can_see_hidden_post":false,"can_wiki":false,"link_counts":[{"url":"https://docs.python.org/3.12/library/typing.html#deprecation-timeline-of-major-features","internal":false,"reflection":false,"title":"typing — Support for type hints — Python 3.12.0b2 documentation","clicks":14}],"read":true,"user_title":"CPython core developer","title_is_group":true,"bookmarked":false,"actions_summary":[{"id":2,"count":9}],"moderator":false,"admin":false,"staff":false,"user_id":9,"hidden":false,"trust_level":3,"deleted_at":null,"user_deleted":false,"edit_reason":null,"can_view_edit_history":true,"wiki":false,"post_url":"/t/formalize-the-concept-of-soft-deprecation-dont-schedule-removal-in-pep-387-backwards-compatibility-policy/27957/8","can_accept_answer":false,"can_unaccept_answer":false,"accepted_answer":false,"topic_accepted_answer":null},{"id":100981,"name":"sinoroc","username":"sinoroc","avatar_template":"/user_avatar/discuss.python.org/sinoroc/{size}/1607_2.png","created_at":"2023-06-16T17:22:55.173Z","cooked":"\u003caside class=\"quote group-committers\" data-username=\"pf_moore\" data-post=\"5\" data-topic=\"27957\"\u003e\n\u003cdiv class=\"title\"\u003e\n\u003cdiv class=\"quote-controls\"\u003e\u003c/div\u003e\n\u003cimg loading=\"lazy\" alt=\"\" width=\"24\" height=\"24\" src=\"https://sea2.discourse-cdn.com/flex016/user_avatar/discuss.python.org/pf_moore/48/35_2.png\" class=\"avatar\"\u003e Paul Moore:\u003c/div\u003e\n\u003cblockquote\u003e\n\u003cp\u003eAfter all, a “soft deprecation” warning \u003cem\u003eisn’t actionable\u003c/em\u003e. The end user can’t do anything, and the developer has no required timescale to make any change. So what’s the action that the warning would be prompting? The only impact of a soft deprecation is “don’t use in new projects”. But it’s not possible to determine programmatically if a use is “in a new project”, so it’s not possible to make an appropriate choice about issuing a message.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/aside\u003e\n\u003cp\u003eIs it something that linters should/could react to? So that the warnings appear to the maintainers instead of the end users of the applications or scripts. I must say I do not know what the current state is. Do linters maintain their own lists of deprecated things?\u003c/p\u003e","post_number":9,"post_type":1,"posts_count":83,"updated_at":"2023-06-16T17:23:07.810Z","reply_count":2,"reply_to_post_number":5,"quote_count":1,"incoming_link_count":0,"reads":143,"readers_count":142,"score":38.6,"yours":false,"topic_id":27957,"topic_slug":"formalize-the-concept-of-soft-deprecation-dont-schedule-removal-in-pep-387-backwards-compatibility-policy","display_username":"sinoroc","primary_group_name":null,"flair_name":null,"flair_url":null,"flair_bg_color":null,"flair_color":null,"flair_group_id":null,"badges_granted":[],"version":1,"can_edit":false,"can_delete":false,"can_recover":false,"can_see_hidden_post":false,"can_wiki":false,"read":true,"user_title":null,"bookmarked":false,"actions_summary":[],"moderator":false,"admin":false,"staff":false,"user_id":1402,"hidden":false,"trust_level":3,"deleted_at":null,"user_deleted":false,"edit_reason":null,"can_view_edit_history":true,"wiki":false,"post_url":"/t/formalize-the-concept-of-soft-deprecation-dont-schedule-removal-in-pep-387-backwards-compatibility-policy/27957/9","can_accept_answer":false,"can_unaccept_answer":false,"accepted_answer":false,"topic_accepted_answer":null},{"id":100985,"name":"Paul Moore","username":"pf_moore","avatar_template":"/user_avatar/discuss.python.org/pf_moore/{size}/35_2.png","created_at":"2023-06-16T17:56:51.527Z","cooked":"\u003caside class=\"quote no-group\" data-username=\"sinoroc\" data-post=\"9\" data-topic=\"27957\"\u003e\n\u003cdiv class=\"title\"\u003e\n\u003cdiv class=\"quote-controls\"\u003e\u003c/div\u003e\n\u003cimg loading=\"lazy\" alt=\"\" width=\"24\" height=\"24\" src=\"https://sea2.discourse-cdn.com/flex016/user_avatar/discuss.python.org/sinoroc/48/1607_2.png\" class=\"avatar\"\u003e sinoroc:\u003c/div\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIs it something that linters should/could react to?\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/aside\u003e\n\u003cp\u003eSpeaking only for pip (but I imagine we’re similar to anyone else using a deprecated-but-won’t-go-away module), we don’t want \u003cem\u003eanyone\u003c/em\u003e telling us optparse is deprecared. \u003cstrong\u003eWe know\u003c/strong\u003e. There simply isn’t anything we need or want to do about it.\u003c/p\u003e\n\u003cp\u003eWe can of course suppress the relevant linter warning, just like we can suppress a runtime warning. But just like a runtime warning, why should we have to?\u003c/p\u003e\n\u003cp\u003eShould someone decide to rip it out, \u003cem\u003ethen\u003c/em\u003e we’d want to know. And I’d hope that any such removal would be done on the same timescales as an actively maintained module like argparse would have been - if “soft deprecated” actually means “we can decide to rip this with no warning because you shouldn’t be using it”, that’s a very different promise than the current one, and I’d expect it to be communicated as such.\u003c/p\u003e","post_number":10,"post_type":1,"posts_count":83,"updated_at":"2023-06-16T17:56:51.527Z","reply_count":0,"reply_to_post_number":9,"quote_count":1,"incoming_link_count":3,"reads":140,"readers_count":139,"score":43.0,"yours":false,"topic_id":27957,"topic_slug":"formalize-the-concept-of-soft-deprecation-dont-schedule-removal-in-pep-387-backwards-compatibility-policy","display_username":"Paul Moore","primary_group_name":"committers","flair_name":"committers","flair_url":"https://us1.discourse-cdn.com/flex002/uploads/python1/original/1X/ca0883b21b8210c5a62c9ac02353de5f24a4d6fc.png","flair_bg_color":"006b94","flair_color":"fac731","flair_group_id":41,"badges_granted":[],"version":1,"can_edit":false,"can_delete":false,"can_recover":false,"can_see_hidden_post":false,"can_wiki":false,"read":true,"user_title":"CPython core developer","title_is_group":true,"bookmarked":false,"actions_summary":[],"moderator":false,"admin":false,"staff":false,"user_id":35,"hidden":false,"trust_level":3,"deleted_at":null,"user_deleted":false,"edit_reason":null,"can_view_edit_history":true,"wiki":false,"post_url":"/t/formalize-the-concept-of-soft-deprecation-dont-schedule-removal-in-pep-387-backwards-compatibility-policy/27957/10","can_accept_answer":false,"can_unaccept_answer":false,"accepted_answer":false,"topic_accepted_answer":null},{"id":100987,"name":"Gregory P. Smith","username":"gpshead","avatar_template":"/user_avatar/discuss.python.org/gpshead/{size}/54_2.png","created_at":"2023-06-16T18:11:51.710Z","cooked":"\u003cp\u003eThere’s a few things being brought up in this thread.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e(A) The documentation issue: Yes I think it is worthwhile making it more clear what type of “deprecation” something is. Right now the term is overloaded with a lot of meanings, so adding clarity to differentiate between “no longer recommended” (APIs we don’t recommend people to use for many possible reasons, but don’t believe it is worth planning to remove) and “stable, but we’ll never remove it and are unlikely to fix bugs or enhance it in the future” (getopt, optparse) and “actual” deprecations where we’ve got a scheduled version in which we intend to make the thing go away (ala \u003ca href=\"https://peps.python.org/pep-0594/\"\u003ePEP-594\u003c/a\u003e).\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e(B) The (f)utility of \u003ccode\u003ePendingDeprecationWarning\u003c/code\u003e - this topic has come up before: \u003ca href=\"https://discuss.python.org/t/pendingdeprecationwarning-is-really-useful/1038\" class=\"inline-onebox\"\u003ePendingDeprecationWarning is really useful?\u003c/a\u003e - our current “wisdom” is basically “don’t bother using that warning, pretend it doesn’t exist”. \u003cem\u003e(hat tip to the lets soft-deprecate PendingDeprecationWarning comment above, we effectively have)\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003eA warning being emitted should always have a justifyable reason for the action it suggests taking to avoid future breakage becoming someones priority to fix in their code.\u003c/p\u003e\n\u003cp\u003eHaving code in place to emit warnings at runtime about things we already know we’ll never break does a disservice to everyone and just cries :deprecated-wolf: when there is no reason for code to be changed. That erodes trust in warnings being meaningful.\u003c/p\u003e\n\u003cp\u003eSo lets not promote the addition of warnings on soft deprecations. Just guide that any form of warning should only be emitted if acting on it clearly improves the future health and longevity of the code triggering it.\u003c/p\u003e\n\u003cp\u003eFor example: We’ll never warn about getopt and optparse. Those are effectively long term stable/stale modules. It isn’t even clear that they should even be called “soft-deprecated”, more that “hey, there’s a fancier thing over here in argparse - but use whichever floats your boat”.\u003c/p\u003e\n\u003cp\u003eWe obviously warn about specific planned date API removals (\u003ca href=\"https://peps.python.org/pep-0594/\"\u003egood riddance asynchat\u003c/a\u003e). And we may choose to warn on APIs that “work” but we consider harmful because they’re too easy to use wrong, especially where we have an alternate API with less sharp edges. We may never remove them, thus soft-deprecation, but peoples code is healthier by not using them.\u003c/p\u003e","post_number":11,"post_type":1,"posts_count":83,"updated_at":"2023-06-16T18:13:21.575Z","reply_count":1,"reply_to_post_number":null,"quote_count":0,"incoming_link_count":12,"reads":138,"readers_count":137,"score":197.6,"yours":false,"topic_id":27957,"topic_slug":"formalize-the-concept-of-soft-deprecation-dont-schedule-removal-in-pep-387-backwards-compatibility-policy","display_username":"Gregory P. Smith","primary_group_name":"committers","flair_name":"committers","flair_url":"https://us1.discourse-cdn.com/flex002/uploads/python1/original/1X/ca0883b21b8210c5a62c9ac02353de5f24a4d6fc.png","flair_bg_color":"006b94","flair_color":"fac731","flair_group_id":41,"badges_granted":[],"version":1,"can_edit":false,"can_delete":false,"can_recover":false,"can_see_hidden_post":false,"can_wiki":false,"link_counts":[{"url":"https://peps.python.org/pep-0594/","internal":false,"reflection":false,"title":"PEP 594 – Removing dead batteries from the standard library | peps.python.org","clicks":9},{"url":"https://discuss.python.org/t/pendingdeprecationwarning-is-really-useful/1038","internal":true,"reflection":false,"title":"PendingDeprecationWarning is really useful?","clicks":3}],"read":true,"user_title":"CPython core developer","title_is_group":true,"bookmarked":false,"actions_summary":[{"id":2,"count":7}],"moderator":false,"admin":false,"staff":false,"user_id":51,"hidden":false,"trust_level":3,"deleted_at":null,"user_deleted":false,"edit_reason":null,"can_view_edit_history":true,"wiki":false,"post_url":"/t/formalize-the-concept-of-soft-deprecation-dont-schedule-removal-in-pep-387-backwards-compatibility-policy/27957/11","can_accept_answer":false,"can_unaccept_answer":false,"accepted_answer":false,"topic_accepted_answer":null},{"id":100993,"name":"Facundo Batista","username":"facundo","avatar_template":"/user_avatar/discuss.python.org/facundo/{size}/53_2.png","created_at":"2023-06-16T19:25:30.674Z","cooked":"\u003caside class=\"quote group-committers\" data-username=\"vstinner\" data-post=\"1\" data-topic=\"27957\"\u003e\n\u003cdiv class=\"title\"\u003e\n\u003cdiv class=\"quote-controls\"\u003e\u003c/div\u003e\n\u003cimg loading=\"lazy\" alt=\"\" width=\"24\" height=\"24\" src=\"https://sea2.discourse-cdn.com/flex016/user_avatar/discuss.python.org/vstinner/48/15130_2.png\" class=\"avatar\"\u003e Victor Stinner:\u003c/div\u003e\n\u003cblockquote\u003e\n\u003cp\u003eI would like to specify clearly a new \u003cstrong\u003e“soft deprecation”\u003c/strong\u003e status in \u003ca href=\"https://peps.python.org/pep-0387/\"\u003ePEP 387: Backwards Compatibility Policy \u003c/a\u003e for functions which should be avoided for new code since \u003cstrong\u003ethese functions will not be developed further\u003c/strong\u003e, but it’s ok to keep them in old code since their removal is not scheduled.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/aside\u003e\n\u003cp\u003eHello Victor,\u003c/p\u003e\n\u003cp\u003eI like the concept and your proposal, with the exception of the name. What is a “soft” deprecation? A deprecation that does not issue a warning? A drepecation that will be enforced after several releases, not a couple? A deprecation that doesn’t harm you if it falls on your foot? \u003cimg src=\"https://emoji.discourse-cdn.com/apple/stuck_out_tongue.png?v=12\" title=\":stuck_out_tongue:\" class=\"emoji\" alt=\":stuck_out_tongue:\" loading=\"lazy\" width=\"20\" height=\"20\"\u003e\u003c/p\u003e\n\u003cp\u003eLet’s find a better name. What about “discouraged”?\u003c/p\u003e\n\u003cp\u003eRegards,\u003c/p\u003e","post_number":12,"post_type":1,"posts_count":83,"updated_at":"2023-06-16T19:25:30.674Z","reply_count":0,"reply_to_post_number":null,"quote_count":1,"incoming_link_count":2,"reads":132,"readers_count":131,"score":36.4,"yours":false,"topic_id":27957,"topic_slug":"formalize-the-concept-of-soft-deprecation-dont-schedule-removal-in-pep-387-backwards-compatibility-policy","display_username":"Facundo Batista","primary_group_name":"committers","flair_name":"committers","flair_url":"https://us1.discourse-cdn.com/flex002/uploads/python1/original/1X/ca0883b21b8210c5a62c9ac02353de5f24a4d6fc.png","flair_bg_color":"006b94","flair_color":"fac731","flair_group_id":41,"badges_granted":[],"version":1,"can_edit":false,"can_delete":false,"can_recover":false,"can_see_hidden_post":false,"can_wiki":false,"read":true,"user_title":"CPython core developer","title_is_group":true,"bookmarked":false,"actions_summary":[],"moderator":false,"admin":false,"staff":false,"user_id":50,"hidden":false,"trust_level":3,"deleted_at":null,"user_deleted":false,"edit_reason":null,"can_view_edit_history":true,"wiki":false,"post_url":"/t/formalize-the-concept-of-soft-deprecation-dont-schedule-removal-in-pep-387-backwards-compatibility-policy/27957/12","can_accept_answer":false,"can_unaccept_answer":false,"accepted_answer":false,"topic_accepted_answer":null},{"id":101028,"name":"Brett Cannon","username":"brettcannon","avatar_template":"/user_avatar/discuss.python.org/brettcannon/{size}/21723_2.png","created_at":"2023-06-16T21:48:38.092Z","cooked":"\u003caside class=\"quote group-committers\" data-username=\"pf_moore\" data-post=\"5\" data-topic=\"27957\"\u003e\n\u003cdiv class=\"title\"\u003e\n\u003cdiv class=\"quote-controls\"\u003e\u003c/div\u003e\n\u003cimg loading=\"lazy\" alt=\"\" width=\"24\" height=\"24\" src=\"https://sea2.discourse-cdn.com/flex016/user_avatar/discuss.python.org/pf_moore/48/35_2.png\" class=\"avatar\"\u003e Paul Moore:\u003c/div\u003e\n\u003cblockquote\u003e\n\u003cp\u003eI don’t think soft deprecations should emit \u003cem\u003eany\u003c/em\u003e sort of warning, they should be “documentation only”.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/aside\u003e\n\u003cp\u003eMy concern with skipping any sort of warning is people who discover via the REPL or copy some code from the internet which is “soft” deprecated and then come wanting a fix or change and get upset we didn’t actively notify them that the thing they were using was abandoned code.\u003c/p\u003e","post_number":13,"post_type":1,"posts_count":83,"updated_at":"2023-06-16T21:48:38.092Z","reply_count":1,"reply_to_post_number":5,"quote_count":1,"incoming_link_count":0,"reads":135,"readers_count":134,"score":77.0,"yours":false,"topic_id":27957,"topic_slug":"formalize-the-concept-of-soft-deprecation-dont-schedule-removal-in-pep-387-backwards-compatibility-policy","display_username":"Brett Cannon","primary_group_name":"committers","flair_name":"committers","flair_url":"https://us1.discourse-cdn.com/flex002/uploads/python1/original/1X/ca0883b21b8210c5a62c9ac02353de5f24a4d6fc.png","flair_bg_color":"006b94","flair_color":"fac731","flair_group_id":41,"badges_granted":[],"version":1,"can_edit":false,"can_delete":false,"can_recover":false,"can_see_hidden_post":false,"can_wiki":false,"read":true,"user_title":"CPython core developer","title_is_group":true,"bookmarked":false,"actions_summary":[{"id":2,"count":3}],"moderator":true,"admin":true,"staff":true,"user_id":36,"hidden":false,"trust_level":4,"deleted_at":null,"user_deleted":false,"edit_reason":null,"can_view_edit_history":true,"wiki":false,"post_url":"/t/formalize-the-concept-of-soft-deprecation-dont-schedule-removal-in-pep-387-backwards-compatibility-policy/27957/13","can_accept_answer":false,"can_unaccept_answer":false,"accepted_answer":false,"topic_accepted_answer":null},{"id":101056,"name":"C.A.M. Gerlach","username":"CAM-Gerlach","avatar_template":"/user_avatar/discuss.python.org/cam-gerlach/{size}/3688_2.png","created_at":"2023-06-17T06:42:15.909Z","cooked":"\u003caside class=\"quote group-committers\" data-username=\"vstinner\" data-post=\"1\" data-topic=\"27957\"\u003e\n\u003cdiv class=\"title\"\u003e\n\u003cdiv class=\"quote-controls\"\u003e\u003c/div\u003e\n\u003cimg loading=\"lazy\" alt=\"\" width=\"24\" height=\"24\" src=\"https://sea2.discourse-cdn.com/flex016/user_avatar/discuss.python.org/vstinner/48/15130_2.png\" class=\"avatar\"\u003e Victor Stinner:\u003c/div\u003e\n\u003cblockquote\u003e\n\u003cp\u003eI proposed \u003ca href=\"https://github.com/python/cpython/pull/105735\"\u003ea PR to deprecate getopt \u003c/a\u003e, but CAM doesn’t seem to fully embrace the idea of “a deprecation” (even if I don’t schedule its removal).\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/aside\u003e\n\u003cp\u003eThanks so much, Victor, for bringing this up and for the comprehensive summary! IMO, formalizing the concept of a “soft” deprecation and a consistent, machine-readable way to explicitly document that would be a major improvement to the status quo. It would also address not only my own specific concerns around \u003ca href=\"https://github.com/python/cpython/pull/105735\"\u003ethe \u003ccode\u003egetopt\u003c/code\u003e deprecation\u003c/a\u003e, but also the more general ones expressed on \u003ca href=\"https://github.com/python/cpython/issues/92564\"\u003epython/cpython#92564\u003c/a\u003e by allowing us to provide additional clarity and specificity with deprecations and their messaging to reduce user and tool uncertainty, but without requiring committing to a specific removal version for cases where it isn’t appropriate.\u003c/p\u003e\n\u003caside class=\"quote group-committers\" data-username=\"vstinner\" data-post=\"1\" data-topic=\"27957\"\u003e\n\u003cdiv class=\"title\"\u003e\n\u003cdiv class=\"quote-controls\"\u003e\u003c/div\u003e\n\u003cimg loading=\"lazy\" alt=\"\" width=\"24\" height=\"24\" src=\"https://sea2.discourse-cdn.com/flex016/user_avatar/discuss.python.org/vstinner/48/15130_2.png\" class=\"avatar\"\u003e Victor Stinner:\u003c/div\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003ccode\u003e.. deprecated::\u003c/code\u003e markup in the documentation, or maybe (better?) a new \u003ccode\u003e.. soft-deprecated::\u003c/code\u003e markup in the documentation (which would link to what it means in details)?\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/aside\u003e\n\u003cp\u003eAs a result of your previous PR, I’d actually been considering proposing an extension to the current directives to explicitly mark a deprecation as a “soft” deprecation, and thinking about it some more in light of your comments above, ISTM that the simplest way to implement that for both user and programmatic consumption would be extending our existing custom \u003ccode\u003edeprecated-removed\u003c/code\u003e directive to support one or more special string values for the second argument in place of the removal version.\u003c/p\u003e\n\u003cp\u003eFor example, we could use \u003ccode\u003e.. deprecated-removed:: 3.14 notplanned \u0026lt;message\u0026gt;\u003c/code\u003e to signal a “soft” deprecation where the API is deprecated but there are no plans to remove it for the immediate future. This would automatically modify the message to read \u003ccode\u003eDeprecated since version X.Y, removal not planned: \u0026lt;message\u0026gt;\u003c/code\u003e, with  \u003ccode\u003enot planned\u003c/code\u003e being a dotted-underline tooltip (\u003ccode\u003e:abbr:\u003c/code\u003e) providing additional clarification, e.g. \u003ccode\u003eThere are no immediate plans to remove this, but it is no longer actively developed and should be avoided in new code.\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eWe could also add a few other special values if needed, e.g. \u003ccode\u003enotdecided\u003c/code\u003e for things that may be removed but the removal timeline is not yet decided upon, with a similar clarifying tooltip.\u003c/p\u003e\n\u003caside class=\"quote group-committers\" data-username=\"gpshead\" data-post=\"11\" data-topic=\"27957\"\u003e\n\u003cdiv class=\"title\"\u003e\n\u003cdiv class=\"quote-controls\"\u003e\u003c/div\u003e\n\u003cimg loading=\"lazy\" alt=\"\" width=\"24\" height=\"24\" src=\"https://sea2.discourse-cdn.com/flex016/user_avatar/discuss.python.org/gpshead/48/54_2.png\" class=\"avatar\"\u003e Gregory P. Smith:\u003c/div\u003e\n\u003cblockquote\u003e\n\u003cp\u003eRight now the term is overloaded with a lot of meanings, so adding clarity to differentiate between “no longer recommended” (APIs we don’t recommend people to use for many possible reasons, but don’t believe it is worth planning to remove) and “stable, but we’ll never remove it and are unlikely to fix bugs or enhance it in the future” (getopt, optparse)\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/aside\u003e\n\u003cp\u003eFor distinctions as to the \u003cem\u003ereason\u003c/em\u003e something was deprecated, e.g. because it is superseded/no longer developed (\u003ccode\u003eoptparse\u003c/code\u003e) as opposed to actively bad to use (\u003ccode\u003ePyObject_SetAttrString(obj, attr_name, NULL)\u003c/code\u003e), because it is a deprecated name alias, etc., I agree this would be valuable to be explicit about in the semantic markup (which could be both read programmatically and generate an appropriate, consistent message for humans).\u003c/p\u003e\n\u003cp\u003eWhile we could shove in more special values to the above, after some thought, it would be a lot cleaner, consistent with current usage and more generally useful to add a \u003ccode\u003e:reason:\u003c/code\u003e option, so it would be usable with both planned and unplanned removals. It would be set to one of a few option values (e.g., \u003ccode\u003enotdeveloped\u003c/code\u003e, \u003ccode\u003eunsafe\u003c/code\u003e, \u003ccode\u003ealias\u003c/code\u003e, \u003ccode\u003eobsolete\u003c/code\u003e, \u003ccode\u003esuperseded\u003c/code\u003e, etc.), and so:\u003c/p\u003e\n\u003cpre data-code-wrap=\"rst\"\u003e\u003ccode class=\"lang-rst\"\u003e.. deprecated-removed:: 3.2 notplanned MESSAGE\n   :reason: alias\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003ecould render as, for instance, “Deprecated since version 3.2, removal not planned (legacy alias): MESSAGE”, with \u003ccode\u003elegacy alias\u003c/code\u003e having an automatic mouseover text describing what that means in more detail.\u003c/p\u003e\n\u003cp\u003eIt wouldn’t be hard to add a \u003ccode\u003e:replace:\u003c/code\u003e option too, so you could do\u003c/p\u003e\n\u003cpre data-code-wrap=\"rst\"\u003e\u003ccode class=\"lang-rst\"\u003e.. deprecated-removed:: 3.2 notplanned\n   :reason: alias\n   :replace: Logger.warning\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eAnd get automatically “\u003cstrong\u003eDeprecated since version 3.2, removal not planned\u003c/strong\u003e \u003cem\u003e(legacy alias of \u003ca href=\"https://docs.python.org/3/library/logging.html#logging.Logger.warning\"\u003e\u003ccode\u003eLogger.warning\u003c/code\u003e\u003c/a\u003e)\u003c/em\u003e”. We could add others, too, which would be very helpful for automation, but that’s getting a bit off topic here.\u003c/p\u003e\n\u003caside class=\"quote group-committers\" data-username=\"vstinner\" data-post=\"1\" data-topic=\"27957\"\u003e\n\u003cdiv class=\"title\"\u003e\n\u003cdiv class=\"quote-controls\"\u003e\u003c/div\u003e\n\u003cimg loading=\"lazy\" alt=\"\" width=\"24\" height=\"24\" src=\"https://sea2.discourse-cdn.com/flex016/user_avatar/discuss.python.org/vstinner/48/15130_2.png\" class=\"avatar\"\u003e Victor Stinner:\u003c/div\u003e\n\u003cblockquote\u003e\n\u003cp\u003eEmit PendingDeprecation in the code\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/aside\u003e\n\u003cp\u003eIf we’re going to emit a warning where we aren’t already for these types of things, IMO it shouldn’t be the existing, established \u003ccode\u003ePendingDeprecationWarning\u003c/code\u003e (which implies it will be removed at some point in the forseeable future) but rather something new that clearly communicates the intent, and that devs can easily individually enable/disable if they want it\u003c/p\u003e\n\u003cp\u003eAs for whether there should be \u003cem\u003esome\u003c/em\u003e kind of warning in the code, I don’t have particularly strong opinion either way. It would be nice to give developers some form of runtime indication, but it could of course be noisy enough that it is more of a net nuisance than a help. Perhaps it should depend on the type of deprecation like those \u003ca class=\"mention\" href=\"/u/gpshead\"\u003e@gpshead\u003c/a\u003e \u003ca href=\"https://discuss.python.org/t/formalize-the-concept-of-soft-deprecation-dont-schedule-removal-in-pep-387-backwards-compatibility-policy/27957/11\"\u003ementioned\u003c/a\u003e — the relative cost-benefit of warning seems a lot better for “not recommended APIs” vs. just “superseded and no longer actively developed” ones, with things like name aliases falling in between—they are easier for users to find and fix than either, but are also less directly harmful.\u003c/p\u003e\n\u003caside class=\"quote no-group\" data-username=\"sinoroc\" data-post=\"9\" data-topic=\"27957\"\u003e\n\u003cdiv class=\"title\"\u003e\n\u003cdiv class=\"quote-controls\"\u003e\u003c/div\u003e\n\u003cimg loading=\"lazy\" alt=\"\" width=\"24\" height=\"24\" src=\"https://sea2.discourse-cdn.com/flex016/user_avatar/discuss.python.org/sinoroc/48/1607_2.png\" class=\"avatar\"\u003e sinoroc:\u003c/div\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIs it something that linters should/could react to?\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/aside\u003e\n\u003cp\u003eWith appropriate docs markup, though, linters could handle the warnings, which are more dev-focused, “softer” and easier to silence than warnings. I’m (slowly) working on some tooling that would allow parsing deprecation and removals out of the docs programmatically (as well as other things like the APIs were added, and other structured metadata), and in turn could then be used to detect (or in some cases even autofix) these issues. It’s not perfect, but it might be a workable middle ground between a runtime warning and a docs message (which unfortunately most devs will probably never read directly), and the proposed docs markup will substantially aid that.\u003c/p\u003e","post_number":14,"post_type":1,"posts_count":83,"updated_at":"2023-06-17T06:42:15.909Z","reply_count":1,"reply_to_post_number":null,"quote_count":3,"incoming_link_count":8,"reads":139,"readers_count":138,"score":72.8,"yours":false,"topic_id":27957,"topic_slug":"formalize-the-concept-of-soft-deprecation-dont-schedule-removal-in-pep-387-backwards-compatibility-policy","display_username":"C.A.M. Gerlach","primary_group_name":"committers","flair_name":"committers","flair_url":"https://us1.discourse-cdn.com/flex002/uploads/python1/original/1X/ca0883b21b8210c5a62c9ac02353de5f24a4d6fc.png","flair_bg_color":"006b94","flair_color":"fac731","flair_group_id":41,"badges_granted":[],"version":1,"can_edit":false,"can_delete":false,"can_recover":false,"can_see_hidden_post":false,"can_wiki":false,"link_counts":[{"url":"https://github.com/python/cpython/pull/105735","internal":false,"reflection":false,"title":"Deprecate the getopt module in its documentation by vstinner · Pull Request #105735 · python/cpython · GitHub","clicks":4},{"url":"https://github.com/python/cpython/issues/92564","internal":false,"reflection":false,"title":"Enforce the use of `deprecated-removed` in docs · Issue #92564 · python/cpython · GitHub","clicks":2},{"url":"https://docs.python.org/3/library/logging.html#logging.Logger.warning","internal":false,"reflection":false,"title":"logging — Logging facility for Python — Python 3.11.4 documentation","clicks":1},{"url":"https://discuss.python.org/t/experience-with-python-3-11-in-fedora/12911/23","internal":true,"reflection":true,"title":"Experience with Python 3.11 in Fedora","clicks":0},{"url":"https://discuss.python.org/t/machine-readable-specification-for-deprecated-and-removed-apis-of-cpython/92039/5","internal":true,"reflection":true,"title":"Machine-readable Specification for Deprecated and Removed APIs of CPython","clicks":0}],"read":true,"user_title":"CPython core developer","title_is_group":true,"bookmarked":false,"actions_summary":[],"moderator":true,"admin":false,"staff":true,"user_id":3654,"hidden":false,"trust_level":4,"deleted_at":null,"user_deleted":false,"edit_reason":null,"can_view_edit_history":true,"wiki":false,"post_url":"/t/formalize-the-concept-of-soft-deprecation-dont-schedule-removal-in-pep-387-backwards-compatibility-policy/27957/14","can_accept_answer":false,"can_unaccept_answer":false,"accepted_answer":false,"topic_accepted_answer":null},{"id":101064,"name":"sinoroc","username":"sinoroc","avatar_template":"/user_avatar/discuss.python.org/sinoroc/{size}/1607_2.png","created_at":"2023-06-17T08:51:00.236Z","cooked":"\u003cp\u003eFrom my point of view deprecations in general should be caught by linters, rather than by the Python interpreter at run-time. That is for the general case, and the other hand I am sure there are plenty of cases where we want the Python interpreter itself to react to deprecations.\u003c/p\u003e\n\u003cp\u003eIt feels to me like it is important to get in touch with authors of linting tools to see what would make sense. I guess one important feature here is that deprecations should be easy to filter out (or in) individually or in sub-groups, over the whole project level or on a case-by-case basis per line of code.\u003c/p\u003e","post_number":15,"post_type":1,"posts_count":83,"updated_at":"2023-06-17T10:21:40.004Z","reply_count":1,"reply_to_post_number":null,"quote_count":0,"incoming_link_count":24,"reads":128,"readers_count":127,"score":150.6,"yours":false,"topic_id":27957,"topic_slug":"formalize-the-concept-of-soft-deprecation-dont-schedule-removal-in-pep-387-backwards-compatibility-policy","display_username":"sinoroc","primary_group_name":null,"flair_name":null,"flair_url":null,"flair_bg_color":null,"flair_color":null,"flair_group_id":null,"badges_granted":[],"version":2,"can_edit":false,"can_delete":false,"can_recover":false,"can_see_hidden_post":false,"can_wiki":false,"read":true,"user_title":null,"bookmarked":false,"actions_summary":[],"moderator":false,"admin":false,"staff":false,"user_id":1402,"hidden":false,"trust_level":3,"deleted_at":null,"user_deleted":false,"edit_reason":null,"can_view_edit_history":true,"wiki":false,"post_url":"/t/formalize-the-concept-of-soft-deprecation-dont-schedule-removal-in-pep-387-backwards-compatibility-policy/27957/15","can_accept_answer":false,"can_unaccept_answer":false,"accepted_answer":false,"topic_accepted_answer":null},{"id":101150,"name":"Jelle Zijlstra","username":"Jelle","avatar_template":"/user_avatar/discuss.python.org/jelle/{size}/1049_2.png","created_at":"2023-06-17T19:21:15.858Z","cooked":"\u003cp\u003eFor catching deprecations in linters, let me just link to my \u003ca href=\"https://peps.python.org/pep-0702/\" class=\"inline-onebox\"\u003ePEP 702 – Marking deprecations using the type system | peps.python.org\u003c/a\u003e, which is currently pending before the Steering Council.\u003c/p\u003e","post_number":16,"post_type":1,"posts_count":83,"updated_at":"2023-06-17T19:21:15.858Z","reply_count":0,"reply_to_post_number":14,"quote_count":0,"incoming_link_count":0,"reads":123,"readers_count":122,"score":54.6,"yours":false,"topic_id":27957,"topic_slug":"formalize-the-concept-of-soft-deprecation-dont-schedule-removal-in-pep-387-backwards-compatibility-policy","display_username":"Jelle Zijlstra","primary_group_name":"committers","flair_name":"committers","flair_url":"https://us1.discourse-cdn.com/flex002/uploads/python1/original/1X/ca0883b21b8210c5a62c9ac02353de5f24a4d6fc.png","flair_bg_color":"006b94","flair_color":"fac731","flair_group_id":41,"badges_granted":[],"version":1,"can_edit":false,"can_delete":false,"can_recover":false,"can_see_hidden_post":false,"can_wiki":false,"link_counts":[{"url":"https://peps.python.org/pep-0702/","internal":false,"reflection":false,"title":"PEP 702 – Marking deprecations using the type system | peps.python.org","clicks":13}],"read":true,"user_title":"CPython core developer","title_is_group":true,"reply_to_user":{"id":3654,"username":"CAM-Gerlach","name":"C.A.M. Gerlach","avatar_template":"/user_avatar/discuss.python.org/cam-gerlach/{size}/3688_2.png"},"bookmarked":false,"actions_summary":[{"id":2,"count":2}],"moderator":false,"admin":false,"staff":false,"user_id":9,"hidden":false,"trust_level":3,"deleted_at":null,"user_deleted":false,"edit_reason":null,"can_view_edit_history":true,"wiki":false,"post_url":"/t/formalize-the-concept-of-soft-deprecation-dont-schedule-removal-in-pep-387-backwards-compatibility-policy/27957/16","can_accept_answer":false,"can_unaccept_answer":false,"accepted_answer":false,"topic_accepted_answer":null},{"id":101185,"name":"Pedro Fonini","username":"fonini","avatar_template":"/user_avatar/discuss.python.org/fonini/{size}/20258_2.png","created_at":"2023-06-17T23:34:54.537Z","cooked":"\u003caside class=\"quote no-group\" data-username=\"sinoroc\" data-post=\"15\" data-topic=\"27957\"\u003e\n\u003cdiv class=\"title\"\u003e\n\u003cdiv class=\"quote-controls\"\u003e\u003c/div\u003e\n\u003cimg loading=\"lazy\" alt=\"\" width=\"24\" height=\"24\" src=\"https://sea2.discourse-cdn.com/flex016/user_avatar/discuss.python.org/sinoroc/48/1607_2.png\" class=\"avatar\"\u003e sinoroc:\u003c/div\u003e\n\u003cblockquote\u003e\n\u003cp\u003eFrom my point of view deprecations in general should be caught by linters, rather than by the Python interpreter at run-time.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/aside\u003e\n\u003cp\u003eFor developers that rely more on unit testing than on static analysis \u003csup class=\"footnote-ref\"\u003e\u003ca href=\"#footnote-101185-1\" id=\"footnote-ref-101185-1\"\u003e[1]\u003c/a\u003e\u003c/sup\u003e, some kind of run-time warning of deprecations is important (even if it’s disabled by default, like \u003ccode\u003eDeprecationWarning\u003c/code\u003e is).\u003c/p\u003e\n\u003chr class=\"footnotes-sep\"\u003e\n\n\u003col class=\"footnotes-list\"\u003e\n\u003cli id=\"footnote-101185-1\" class=\"footnote-item\"\u003e\u003cp\u003eIn my modest experience, that’s a whole lot of people. \u003ca href=\"#footnote-ref-101185-1\" class=\"footnote-backref\"\u003e↩︎\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e","post_number":17,"post_type":1,"posts_count":83,"updated_at":"2023-06-18T13:52:48.205Z","reply_count":2,"reply_to_post_number":15,"quote_count":1,"incoming_link_count":0,"reads":125,"readers_count":124,"score":80.0,"yours":false,"topic_id":27957,"topic_slug":"formalize-the-concept-of-soft-deprecation-dont-schedule-removal-in-pep-387-backwards-compatibility-policy","display_username":"Pedro Fonini","primary_group_name":null,"flair_name":null,"flair_url":null,"flair_bg_color":null,"flair_color":null,"flair_group_id":null,"badges_granted":[],"version":2,"can_edit":false,"can_delete":false,"can_recover":false,"can_see_hidden_post":false,"can_wiki":false,"read":true,"user_title":"","bookmarked":false,"actions_summary":[{"id":2,"count":3}],"moderator":false,"admin":false,"staff":false,"user_id":6606,"hidden":false,"trust_level":2,"deleted_at":null,"user_deleted":false,"edit_reason":null,"can_view_edit_history":true,"wiki":false,"post_url":"/t/formalize-the-concept-of-soft-deprecation-dont-schedule-removal-in-pep-387-backwards-compatibility-policy/27957/17","can_accept_answer":false,"can_unaccept_answer":false,"accepted_answer":false,"topic_accepted_answer":null},{"id":101286,"name":"Victor Stinner","username":"vstinner","avatar_template":"/user_avatar/discuss.python.org/vstinner/{size}/15130_2.png","created_at":"2023-06-19T07:24:03.262Z","cooked":"\u003cp\u003eApparently, the “soft deprecation” expression is bad since it’s too close to “regular hard deprecation”, and usually “deprecation” is associated with a short-term or long-term plan to remove a feature. Is there a better term to say “you should not use this function but there is no plan to remove it”?\u003c/p\u003e\n\u003cp\u003eIt seems like this concept should be dissociated from deprecations, so reusing the existing PendingDeprecationWaring is a bad idea since PendingDeprecationWaring means indirectly “pending removal” which is not the case here.\u003c/p\u003e","post_number":18,"post_type":1,"posts_count":83,"updated_at":"2023-06-19T07:24:03.262Z","reply_count":1,"reply_to_post_number":17,"quote_count":0,"incoming_link_count":0,"reads":122,"readers_count":121,"score":44.4,"yours":false,"topic_id":27957,"topic_slug":"formalize-the-concept-of-soft-deprecation-dont-schedule-removal-in-pep-387-backwards-compatibility-policy","display_username":"Victor Stinner","primary_group_name":"committers","flair_name":"committers","flair_url":"https://us1.discourse-cdn.com/flex002/uploads/python1/original/1X/ca0883b21b8210c5a62c9ac02353de5f24a4d6fc.png","flair_bg_color":"006b94","flair_color":"fac731","flair_group_id":41,"badges_granted":[],"version":1,"can_edit":false,"can_delete":false,"can_recover":false,"can_see_hidden_post":false,"can_wiki":false,"read":true,"user_title":"CPython core developer","title_is_group":true,"reply_to_user":{"id":6606,"username":"fonini","name":"Pedro Fonini","avatar_template":"/user_avatar/discuss.python.org/fonini/{size}/20258_2.png"},"bookmarked":false,"actions_summary":[{"id":2,"count":1}],"moderator":false,"admin":false,"staff":false,"user_id":13,"hidden":false,"trust_level":3,"deleted_at":null,"user_deleted":false,"edit_reason":null,"can_view_edit_history":true,"wiki":false,"post_url":"/t/formalize-the-concept-of-soft-deprecation-dont-schedule-removal-in-pep-387-backwards-compatibility-policy/27957/18","can_accept_answer":false,"can_unaccept_answer":false,"accepted_answer":false,"topic_accepted_answer":null},{"id":101290,"name":"Chris Markiewicz","username":"effigies","avatar_template":"/user_avatar/discuss.python.org/effigies/{size}/6953_2.png","created_at":"2023-06-19T07:41:45.590Z","cooked":"\u003cp\u003eAbandoned?\u003c/p\u003e","post_number":19,"post_type":1,"posts_count":83,"updated_at":"2023-06-19T07:41:45.590Z","reply_count":0,"reply_to_post_number":null,"quote_count":0,"incoming_link_count":0,"reads":118,"readers_count":117,"score":23.6,"yours":false,"topic_id":27957,"topic_slug":"formalize-the-concept-of-soft-deprecation-dont-schedule-removal-in-pep-387-backwards-compatibility-policy","display_username":"Chris Markiewicz","primary_group_name":null,"flair_name":null,"flair_url":null,"flair_bg_color":null,"flair_color":null,"flair_group_id":null,"badges_granted":[],"version":1,"can_edit":false,"can_delete":false,"can_recover":false,"can_see_hidden_post":false,"can_wiki":false,"read":true,"user_title":null,"bookmarked":false,"actions_summary":[],"moderator":false,"admin":false,"staff":false,"user_id":1217,"hidden":false,"trust_level":3,"deleted_at":null,"user_deleted":false,"edit_reason":null,"can_view_edit_history":true,"wiki":false,"post_url":"/t/formalize-the-concept-of-soft-deprecation-dont-schedule-removal-in-pep-387-backwards-compatibility-policy/27957/19","can_accept_answer":false,"can_unaccept_answer":false,"accepted_answer":false,"topic_accepted_answer":null},{"id":101292,"name":"H. Vetinari","username":"h-vetinari","avatar_template":"/user_avatar/discuss.python.org/h-vetinari/{size}/1220_2.png","created_at":"2023-06-19T07:43:36.887Z","cooked":"\u003caside class=\"quote group-committers\" data-username=\"vstinner\" data-post=\"18\" data-topic=\"27957\"\u003e\n\u003cdiv class=\"title\"\u003e\n\u003cdiv class=\"quote-controls\"\u003e\u003c/div\u003e\n\u003cimg loading=\"lazy\" alt=\"\" width=\"24\" height=\"24\" src=\"https://sea2.discourse-cdn.com/flex016/user_avatar/discuss.python.org/vstinner/48/15130_2.png\" class=\"avatar\"\u003e Victor Stinner:\u003c/div\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIs there a better term to say “you should not use this function but there is no plan to remove it”?\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/aside\u003e\n\u003cp\u003eA possibility would be: “This function is obsolete” or perhaps “obsolescent”. The latter is much less common, and \u003ca href=\"https://www.thefreedictionary.com/obsolescent\" rel=\"noopener nofollow ugc\"\u003emeans\u003c/a\u003e “Being in the process of passing out of use or usefulness; becoming obsolete.”; it’s used by the C standard for example, which \u003ca href=\"https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3096.pdf\" rel=\"noopener nofollow ugc\"\u003esays\u003c/a\u003e:\u003c/p\u003e\n\u003caside class=\"quote no-group\"\u003e\n\u003cblockquote\u003e\n\u003cp\u003eCertain features are \u003cem\u003eobsolescent\u003c/em\u003e, which means that they could be considered for withdrawal in future revisions of this document. They are retained because of their widespread use, but their use in new implementations (for implementation features) or new programs (for language [6.11] or library features [7.33]) is discouraged.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/aside\u003e","post_number":20,"post_type":1,"posts_count":83,"updated_at":"2023-06-19T07:44:09.888Z","reply_count":1,"reply_to_post_number":18,"quote_count":1,"incoming_link_count":1,"reads":119,"readers_count":118,"score":78.8,"yours":false,"topic_id":27957,"topic_slug":"formalize-the-concept-of-soft-deprecation-dont-schedule-removal-in-pep-387-backwards-compatibility-policy","display_username":"H. Vetinari","primary_group_name":null,"flair_name":null,"flair_url":null,"flair_bg_color":null,"flair_color":null,"flair_group_id":null,"badges_granted":[],"version":1,"can_edit":false,"can_delete":false,"can_recover":false,"can_see_hidden_post":false,"can_wiki":false,"link_counts":[{"url":"https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3096.pdf","internal":false,"reflection":false,"clicks":0},{"url":"https://www.thefreedictionary.com/obsolescent","internal":false,"reflection":false,"title":"Obsolescent - definition of obsolescent by The Free Dictionary","clicks":0}],"read":true,"user_title":null,"bookmarked":false,"actions_summary":[{"id":2,"count":3}],"moderator":false,"admin":false,"staff":false,"user_id":1017,"hidden":false,"trust_level":2,"deleted_at":null,"user_deleted":false,"edit_reason":null,"can_view_edit_history":true,"wiki":false,"post_url":"/t/formalize-the-concept-of-soft-deprecation-dont-schedule-removal-in-pep-387-backwards-compatibility-policy/27957/20","can_accept_answer":false,"can_unaccept_answer":false,"accepted_answer":false,"topic_accepted_answer":null}],"stream":[100899,100909,100910,100914,100920,100927,100934,100943,100981,100985,100987,100993,101028,101056,101064,101150,101185,101286,101290,101292,101294,101295,101298,101301,101307,101336,101426,101803,102406,102408,102413,102415,102548,102643,102650,102663,102664,102689,102693,102696,102698,102701,102726,102729,102743,102751,102760,102792,102794,102839,102845,102849,102853,102855,102895,102899,102911,102926,102928,102929,102931,102935,102945,102983,102986,102991,103045,103055,103063,103077,103225,103245,103261,103307,103314,103316,103317,103320,103347,103362,103368,103373,103394]},"timeline_lookup":[[1,1001],[14,1000],[18,998],[28,995],[29,991],[33,990],[36,989],[50,988],[57,987],[67,986],[71,984],[80,983]],"tags":[],"tags_descriptions":{},"fancy_title":"Formalize the concept of \u0026ldquo;soft deprecation\u0026rdquo; (don\u0026rsquo;t schedule removal) in PEP 387 \u0026ldquo;Backwards Compatibility Policy\u0026rdquo;","id":27957,"title":"Formalize the concept of \"soft deprecation\" (don't schedule removal) in PEP 387 \"Backwards Compatibility Policy\"","posts_count":83,"created_at":"2023-06-16T10:04:48.263Z","views":6674,"reply_count":62,"like_count":142,"last_posted_at":"2023-07-04T12:07:24.247Z","visible":true,"closed":false,"archived":false,"has_summary":true,"archetype":"regular","slug":"formalize-the-concept-of-soft-deprecation-dont-schedule-removal-in-pep-387-backwards-compatibility-policy","category_id":23,"word_count":14463,"deleted_at":null,"user_id":13,"featured_link":null,"pinned_globally":false,"pinned_at":null,"pinned_until":null,"image_url":null,"slow_mode_seconds":0,"draft":null,"draft_key":"topic_27957","draft_sequence":null,"unpinned":null,"pinned":false,"current_post_number":1,"highest_post_number":85,"deleted_by":null,"actions_summary":[{"id":4,"count":0,"hidden":false,"can_act":false},{"id":8,"count":0,"hidden":false,"can_act":false},{"id":10,"count":0,"hidden":false,"can_act":false},{"id":7,"count":0,"hidden":false,"can_act":false}],"chunk_size":20,"bookmarked":false,"topic_timer":null,"message_bus_last_id":0,"participant_count":29,"show_read_indicator":false,"thumbnails":null,"slow_mode_enabled_until":null,"summarizable":false,"has_cached_summary":false,"can_vote":false,"vote_count":0,"user_voted":false,"discourse_zendesk_plugin_zendesk_id":null,"discourse_zendesk_plugin_zendesk_url":"https://your-url.zendesk.com/agent/tickets/","details":{"can_edit":false,"notification_level":1,"participants":[{"id":13,"username":"vstinner","name":"Victor Stinner","avatar_template":"/user_avatar/discuss.python.org/vstinner/{size}/15130_2.png","post_count":20,"primary_group_name":"committers","flair_name":"committers","flair_url":"https://us1.discourse-cdn.com/flex002/uploads/python1/original/1X/ca0883b21b8210c5a62c9ac02353de5f24a4d6fc.png","flair_color":"fac731","flair_bg_color":"006b94","flair_group_id":41,"trust_level":3},{"id":3654,"username":"CAM-Gerlach","name":"C.A.M. Gerlach","avatar_template":"/user_avatar/discuss.python.org/cam-gerlach/{size}/3688_2.png","post_count":9,"primary_group_name":"committers","flair_name":"committers","flair_url":"https://us1.discourse-cdn.com/flex002/uploads/python1/original/1X/ca0883b21b8210c5a62c9ac02353de5f24a4d6fc.png","flair_color":"fac731","flair_bg_color":"006b94","flair_group_id":41,"moderator":true,"trust_level":4},{"id":35,"username":"pf_moore","name":"Paul Moore","avatar_template":"/user_avatar/discuss.python.org/pf_moore/{size}/35_2.png","post_count":6,"primary_group_name":"committers","flair_name":"committers","flair_url":"https://us1.discourse-cdn.com/flex002/uploads/python1/original/1X/ca0883b21b8210c5a62c9ac02353de5f24a4d6fc.png","flair_color":"fac731","flair_bg_color":"006b94","flair_group_id":41,"trust_level":3},{"id":36,"username":"brettcannon","name":"Brett Cannon","avatar_template":"/user_avatar/discuss.python.org/brettcannon/{size}/21723_2.png","post_count":4,"primary_group_name":"committers","flair_name":"committers","flair_url":"https://us1.discourse-cdn.com/flex002/uploads/python1/original/1X/ca0883b21b8210c5a62c9ac02353de5f24a4d6fc.png","flair_color":"fac731","flair_bg_color":"006b94","flair_group_id":41,"admin":true,"moderator":true,"trust_level":4},{"id":26,"username":"encukou","name":"Petr Viktorin","avatar_template":"/user_avatar/discuss.python.org/encukou/{size}/2461_2.png","post_count":4,"primary_group_name":"committers","flair_name":null,"flair_url":null,"flair_color":null,"flair_bg_color":null,"flair_group_id":null,"trust_level":3},{"id":1017,"username":"h-vetinari","name":"H. Vetinari","avatar_template":"/user_avatar/discuss.python.org/h-vetinari/{size}/1220_2.png","post_count":4,"primary_group_name":null,"flair_name":null,"flair_url":null,"flair_color":null,"flair_bg_color":null,"flair_group_id":null,"trust_level":2},{"id":54,"username":"steve.dower","name":"Steve Dower","avatar_template":"/user_avatar/discuss.python.org/steve.dower/{size}/56_2.png","post_count":3,"primary_group_name":"committers","flair_name":"committers","flair_url":"https://us1.discourse-cdn.com/flex002/uploads/python1/original/1X/ca0883b21b8210c5a62c9ac02353de5f24a4d6fc.png","flair_color":"fac731","flair_bg_color":"006b94","flair_group_id":41,"trust_level":3},{"id":1402,"username":"sinoroc","name":"sinoroc","avatar_template":"/user_avatar/discuss.python.org/sinoroc/{size}/1607_2.png","post_count":3,"primary_group_name":null,"flair_name":null,"flair_url":null,"flair_color":null,"flair_bg_color":null,"flair_group_id":null,"trust_level":3},{"id":1217,"username":"effigies","name":"Chris Markiewicz","avatar_template":"/user_avatar/discuss.python.org/effigies/{size}/6953_2.png","post_count":2,"primary_group_name":null,"flair_name":null,"flair_url":null,"flair_color":null,"flair_bg_color":null,"flair_group_id":null,"trust_level":3},{"id":42,"username":"methane","name":"Inada Naoki","avatar_template":"/user_avatar/discuss.python.org/methane/{size}/43_2.png","post_count":2,"primary_group_name":"committers","flair_name":"committers","flair_url":"https://us1.discourse-cdn.com/flex002/uploads/python1/original/1X/ca0883b21b8210c5a62c9ac02353de5f24a4d6fc.png","flair_color":"fac731","flair_bg_color":"006b94","flair_group_id":41,"trust_level":3},{"id":51,"username":"gpshead","name":"Gregory P. Smith","avatar_template":"/user_avatar/discuss.python.org/gpshead/{size}/54_2.png","post_count":2,"primary_group_name":"committers","flair_name":"committers","flair_url":"https://us1.discourse-cdn.com/flex002/uploads/python1/original/1X/ca0883b21b8210c5a62c9ac02353de5f24a4d6fc.png","flair_color":"fac731","flair_bg_color":"006b94","flair_group_id":41,"trust_level":3},{"id":9,"username":"Jelle","name":"Jelle Zijlstra","avatar_template":"/user_avatar/discuss.python.org/jelle/{size}/1049_2.png","post_count":2,"primary_group_name":"committers","flair_name":"committers","flair_url":"https://us1.discourse-cdn.com/flex002/uploads/python1/original/1X/ca0883b21b8210c5a62c9ac02353de5f24a4d6fc.png","flair_color":"fac731","flair_bg_color":"006b94","flair_group_id":41,"trust_level":3},{"id":11030,"username":"kknechtel","name":"Karl Knechtel","avatar_template":"https://avatars.discourse-cdn.com/v4/letter/k/e47c2d/{size}.png","post_count":2,"primary_group_name":null,"flair_name":null,"flair_url":null,"flair_color":null,"flair_bg_color":null,"flair_group_id":null,"trust_level":3},{"id":47,"username":"malemburg","name":"Marc-André Lemburg","avatar_template":"/user_avatar/discuss.python.org/malemburg/{size}/50_2.png","post_count":2,"primary_group_name":"committers","flair_name":"committers","flair_url":"https://us1.discourse-cdn.com/flex002/uploads/python1/original/1X/ca0883b21b8210c5a62c9ac02353de5f24a4d6fc.png","flair_color":"fac731","flair_bg_color":"006b94","flair_group_id":41,"trust_level":3},{"id":8557,"username":"DanielNoord","name":"Daniël van Noord","avatar_template":"/user_avatar/discuss.python.org/danielnoord/{size}/8787_2.png","post_count":2,"primary_group_name":null,"flair_name":null,"flair_url":null,"flair_color":null,"flair_bg_color":null,"flair_group_id":null,"trust_level":2},{"id":1070,"username":"oscarbenjamin","name":"Oscar Benjamin","avatar_template":"/user_avatar/discuss.python.org/oscarbenjamin/{size}/1209_2.png","post_count":2,"primary_group_name":null,"flair_name":null,"flair_url":null,"flair_color":null,"flair_bg_color":null,"flair_group_id":null,"trust_level":3},{"id":23,"username":"pitrou","name":"Antoine Pitrou","avatar_template":"/user_avatar/discuss.python.org/pitrou/{size}/28_2.png","post_count":2,"primary_group_name":"committers","flair_name":"committers","flair_url":"https://us1.discourse-cdn.com/flex002/uploads/python1/original/1X/ca0883b21b8210c5a62c9ac02353de5f24a4d6fc.png","flair_color":"fac731","flair_bg_color":"006b94","flair_group_id":41,"trust_level":3},{"id":50,"username":"facundo","name":"Facundo Batista","avatar_template":"/user_avatar/discuss.python.org/facundo/{size}/53_2.png","post_count":1,"primary_group_name":"committers","flair_name":"committers","flair_url":"https://us1.discourse-cdn.com/flex002/uploads/python1/original/1X/ca0883b21b8210c5a62c9ac02353de5f24a4d6fc.png","flair_color":"fac731","flair_bg_color":"006b94","flair_group_id":41,"trust_level":3},{"id":65,"username":"markshannon","name":"Mark Shannon","avatar_template":"/user_avatar/discuss.python.org/markshannon/{size}/72_2.png","post_count":1,"primary_group_name":"committers","flair_name":"committers","flair_url":"https://us1.discourse-cdn.com/flex002/uploads/python1/original/1X/ca0883b21b8210c5a62c9ac02353de5f24a4d6fc.png","flair_color":"fac731","flair_bg_color":"006b94","flair_group_id":41,"trust_level":3},{"id":6606,"username":"fonini","name":"Pedro Fonini","avatar_template":"/user_avatar/discuss.python.org/fonini/{size}/20258_2.png","post_count":1,"primary_group_name":null,"flair_name":null,"flair_url":null,"flair_color":null,"flair_bg_color":null,"flair_group_id":null,"trust_level":2},{"id":13100,"username":"Pierre-Sassoulas","name":"Pierre Sassoulas","avatar_template":"/user_avatar/discuss.python.org/pierre-sassoulas/{size}/13171_2.png","post_count":1,"primary_group_name":null,"flair_name":null,"flair_url":null,"flair_color":null,"flair_bg_color":null,"flair_group_id":null,"trust_level":2},{"id":17,"username":"barry","name":"Barry Warsaw","avatar_template":"/user_avatar/discuss.python.org/barry/{size}/42_2.png","post_count":1,"primary_group_name":"committers","flair_name":"steering-council","flair_url":"fab-python","flair_color":"4B8BBE","flair_bg_color":"FFE873","flair_group_id":45,"trust_level":3},{"id":3079,"username":"jeanas","name":"Jean Abou Samra","avatar_template":"/user_avatar/discuss.python.org/jeanas/{size}/8115_2.png","post_count":1,"primary_group_name":null,"flair_name":null,"flair_url":null,"flair_color":null,"flair_bg_color":null,"flair_group_id":null,"trust_level":2},{"id":20,"username":"ericvsmith","name":"Eric V. Smith","avatar_template":"https://avatars.discourse-cdn.com/v4/letter/e/34f0e0/{size}.png","post_count":1,"primary_group_name":"committers","flair_name":"committers","flair_url":"https://us1.discourse-cdn.com/flex002/uploads/python1/original/1X/ca0883b21b8210c5a62c9ac02353de5f24a4d6fc.png","flair_color":"fac731","flair_bg_color":"006b94","flair_group_id":41,"trust_level":3}],"created_by":{"id":13,"username":"vstinner","name":"Victor Stinner","avatar_template":"/user_avatar/discuss.python.org/vstinner/{size}/15130_2.png"},"last_poster":{"id":1070,"username":"oscarbenjamin","name":"Oscar Benjamin","avatar_template":"/user_avatar/discuss.python.org/oscarbenjamin/{size}/1209_2.png"},"links":[{"url":"https://peps.python.org/pep-0387/","title":"PEP 387 – Backwards Compatibility Policy | peps.python.org","internal":false,"attachment":false,"reflection":false,"clicks":101,"user_id":13,"domain":"peps.python.org","root_domain":"python.org"},{"url":"https://github.com/python/cpython/pull/105735","title":"Deprecate the getopt module in its documentation by vstinner · Pull Request #105735 · python/cpython · GitHub","internal":false,"attachment":false,"reflection":false,"clicks":35,"user_id":13,"domain":"github.com","root_domain":"github.com"},{"url":"https://github.com/python/cpython/issues/105373","title":"Keep deprecated functions in Python 3.13: remove this deprecation · Issue #105373 · python/cpython · GitHub","internal":false,"attachment":false,"reflection":false,"clicks":32,"user_id":13,"domain":"github.com","root_domain":"github.com"},{"url":"https://docs.python.org/3.12/library/typing.html#deprecation-timeline-of-major-features","title":"typing — Support for type hints — Python 3.12.0b2 documentation","internal":false,"attachment":false,"reflection":false,"clicks":14,"user_id":9,"domain":"docs.python.org","root_domain":"python.org"},{"url":"https://peps.python.org/pep-0702/","title":"PEP 702 – Marking deprecations using the type system | peps.python.org","internal":false,"attachment":false,"reflection":false,"clicks":13,"user_id":9,"domain":"peps.python.org","root_domain":"python.org"},{"url":"https://peps.python.org/pep-0594/","title":"PEP 594 – Removing dead batteries from the standard library | peps.python.org","internal":false,"attachment":false,"reflection":false,"clicks":9,"user_id":51,"domain":"peps.python.org","root_domain":"python.org"},{"url":"https://github.com/python/steering-council/issues/199","title":"Update PEP 387 Backwards Compatibility Policy: Add Soft Deprecation · Issue #199 · python/steering-council · GitHub","internal":false,"attachment":false,"reflection":false,"clicks":9,"user_id":13,"domain":"github.com","root_domain":"github.com"},{"url":"https://docs.python.org/3.11/library/colorsys.html","title":"colorsys — Conversions between color systems — Python 3.11.4 documentation","internal":false,"attachment":false,"reflection":false,"clicks":7,"user_id":11911,"domain":"docs.python.org","root_domain":"python.org"},{"url":"https://github.com/python/cpython/pull/105374","title":"gh-105373: PyObject_SetAttr(NULL) is no longer deprecated by vstinner · Pull Request #105374 · python/cpython · GitHub","internal":false,"attachment":false,"reflection":false,"clicks":7,"user_id":13,"domain":"github.com","root_domain":"github.com"},{"url":"https://github.com/python/peps/pull/3182","title":"PEP 387: Add Soft Deprecation section by vstinner · Pull Request #3182 · python/peps · GitHub","internal":false,"attachment":false,"reflection":false,"clicks":7,"user_id":13,"domain":"github.com","root_domain":"github.com"},{"url":"https://en.wikipedia.org/wiki/HSL_and_HSV#Disadvantages","title":"HSL and HSV - Wikipedia","internal":false,"attachment":false,"reflection":false,"clicks":6,"user_id":11911,"domain":"en.wikipedia.org","root_domain":"wikipedia.org"},{"url":"https://www.merriam-webster.com/dictionary/deprecation","title":"Deprecation Definition \u0026 Meaning - Merriam-Webster","internal":false,"attachment":false,"reflection":false,"clicks":5,"user_id":65,"domain":"www.merriam-webster.com","root_domain":"merriam-webster.com"},{"url":"https://github.com/python/steering-council/issues/199#issuecomment-1619018628","title":"Update PEP 387 Backwards Compatibility Policy: Add Soft Deprecation · Issue #199 · python/steering-council · GitHub","internal":false,"attachment":false,"reflection":false,"clicks":5,"user_id":13,"domain":"github.com","root_domain":"github.com"},{"url":"https://github.com/python/peps/commit/57b1d94a4f8dee71bd96a8f1dbd0a5c6b010c851","title":"PEP 387: Add Soft Deprecation section (#3182) · python/peps@57b1d94 · GitHub","internal":false,"attachment":false,"reflection":false,"clicks":5,"user_id":13,"domain":"github.com","root_domain":"github.com"},{"url":"https://peps.python.org/pep-0594/#colorsys","title":"PEP 594 – Removing dead batteries from the standard library | peps.python.org","internal":false,"attachment":false,"reflection":false,"clicks":4,"user_id":11911,"domain":"peps.python.org","root_domain":"python.org"},{"url":"https://docs.python.org/dev/library/devmode.html","title":"Python Development Mode — Python 3.13.0a0 documentation","internal":false,"attachment":false,"reflection":false,"clicks":4,"user_id":13,"domain":"docs.python.org","root_domain":"python.org"},{"url":"https://github.com/python/cpython/pull/106241","title":"gh-106240: Add stdlib_deprecations module by vstinner · Pull Request #106241 · python/cpython · GitHub","internal":false,"attachment":false,"reflection":false,"clicks":4,"user_id":13,"domain":"github.com","root_domain":"github.com"},{"url":"https://discuss.python.org/t/pendingdeprecationwarning-is-really-useful/1038","title":"PendingDeprecationWarning is really useful?","internal":true,"attachment":false,"reflection":false,"clicks":3,"user_id":51,"domain":"discuss.python.org","root_domain":"python.org"},{"url":"https://www.merriam-webster.com/dictionary/deprecate","title":"Deprecate Definition \u0026 Meaning - Merriam-Webster","internal":false,"attachment":false,"reflection":false,"clicks":3,"user_id":47,"domain":"www.merriam-webster.com","root_domain":"merriam-webster.com"},{"url":"https://cran.r-project.org/web/packages/lifecycle/vignettes/stages.html","title":"Lifecycle stages","internal":false,"attachment":false,"reflection":false,"clicks":2,"user_id":13,"domain":"cran.r-project.org","root_domain":"r-project.org"},{"url":"https://developer.mozilla.org/en-US/docs/Web/API/Document","title":"Document - Web APIs | MDN","internal":false,"attachment":false,"reflection":false,"clicks":2,"user_id":26,"domain":"developer.mozilla.org","root_domain":"mozilla.org"},{"url":"https://forums.swift.org/t/dont-see-any-deprecation-warning-due-to-deprecated-100000-0-whats-the-rationale-for-marking-it-this-way/38404","title":"Don't see any deprecation warning, due to \"deprecated: 100000.0\"? What's the rationale for marking it this way?! - Using Swift - Swift Forums","internal":false,"attachment":false,"reflection":false,"clicks":2,"user_id":13,"domain":"forums.swift.org","root_domain":"swift.org"},{"url":"https://github.com/python/cpython/issues/92564","title":"Enforce the use of `deprecated-removed` in docs · Issue #92564 · python/cpython · GitHub","internal":false,"attachment":false,"reflection":false,"clicks":2,"user_id":3654,"domain":"github.com","root_domain":"github.com"},{"url":"https://github.com/python/cpython/pull/106142","title":"gh-106137: Add SoftDeprecationWarning category by vstinner · Pull Request #106142 · python/cpython · GitHub","internal":false,"attachment":false,"reflection":false,"clicks":2,"user_id":13,"domain":"github.com","root_domain":"github.com"},{"url":"https://hexdocs.pm/elixir/1.5.0-rc.2/deprecations.html","title":"Deprecations – Elixir v1.5.0-rc.2","internal":false,"attachment":false,"reflection":false,"clicks":1,"user_id":13,"domain":"hexdocs.pm","root_domain":"hexdocs.pm"},{"url":"https://github.com/pylint-dev/pylint/blob/3a99820113cf4d449e7d7fcec53375b799c7b608/pylint/checkers/stdlib.py#L48","title":"pylint/pylint/checkers/stdlib.py at 3a99820113cf4d449e7d7fcec53375b799c7b608 · pylint-dev/pylint · GitHub","internal":false,"attachment":false,"reflection":false,"clicks":1,"user_id":8557,"domain":"github.com","root_domain":"github.com"},{"url":"https://docs.python.org/3/library/logging.html#logging.Logger.warning","title":"logging — Logging facility for Python — Python 3.11.4 documentation","internal":false,"attachment":false,"reflection":false,"clicks":1,"user_id":3654,"domain":"docs.python.org","root_domain":"python.org"},{"url":"https://www.mediawiki.org/wiki/Stable_interface_policy#Soft_deprecation","title":"Stable interface policy - MediaWiki","internal":false,"attachment":false,"reflection":false,"clicks":1,"user_id":13,"domain":"www.mediawiki.org","root_domain":"mediawiki.org"},{"url":"https://docs.python.org/3.12/whatsnew/3.12.html#pending-removal-in-future-versions","title":"What’s New In Python 3.12 — Python 3.12.0b3 documentation","internal":false,"attachment":false,"reflection":false,"clicks":1,"user_id":26,"domain":"docs.python.org","root_domain":"python.org"},{"url":"https://developers.elementor.com/v3-7-planned-deprecations/","title":null,"internal":false,"attachment":false,"reflection":false,"clicks":1,"user_id":13,"domain":"developers.elementor.com","root_domain":"elementor.com"},{"url":"https://www.thefreedictionary.com/obsolete","title":"Obsolete - definition of obsolete by The Free Dictionary","internal":false,"attachment":false,"reflection":false,"clicks":1,"user_id":1017,"domain":"www.thefreedictionary.com","root_domain":"thefreedictionary.com"}]},"bookmarks":[]}