You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Python has the concept of "immortal" interned strings: PyUnicode_InternImmortal().
The feature was first introduced in the Python 2 "str" (bytes) type, bpo-576101 (commit 45ec02a). New PyString_InternImmortal() function.
commit 45ec02a
Author: Guido van Rossum <guido@python.org>
Date: Mon Aug 19 21:43:18 2002 +0000
SF patch 576101, by Oren Tirosh: alternative implementation of
interning. I modified Oren's patch significantly, but the basic idea
and most of the implementation is unchanged. Interned strings created
with PyString_InternInPlace() are now mortal, and you must keep a
reference to the resulting string around; use the new function
PyString_InternImmortal() to create immortal interned strings.
Later, the feature was added to the PyUnicodeObject type, new PyUnicode_InternImmortal() function:
Add interning of unicode strings by copying the functionality from
stringobject.c.
Intern "True" and "False" in bool_repr() again as it was in the
8bit string era.
Since Python 3.10, (mortal) interned strings are cleared at Python exit in Py_Finalize(). It avoids leaking memory when Python is embedded in an application: bpo-1635741.
bpo-1635741: Release Unicode interned strings at exit (GH-21269)
* PyUnicode_InternInPlace() now ensures that interned strings are
ready.
* Add _PyUnicode_ClearInterned().
* Py_Finalize() now releases Unicode interned strings:
call _PyUnicode_ClearInterned().
--
PyUnicode_InternImmortal() is not used in the Python standard library. I propose to start deprecating the function and remove it in Python 3.12 (PEP-387 requires a deprecation for 2 releases). In Python 3.10, calling the function will emit a DeprecationWarning at runtime.
Note: PyString_InternImmortal() (for bytes strings) has been removed from Python 3.0.
Activity
vstinner commentedon Sep 2, 2020
Python has the concept of "immortal" interned strings: PyUnicode_InternImmortal().
The feature was first introduced in the Python 2 "str" (bytes) type, bpo-576101 (commit 45ec02a). New PyString_InternImmortal() function.
commit 45ec02a
Author: Guido van Rossum <guido@python.org>
Date: Mon Aug 19 21:43:18 2002 +0000
Later, the feature was added to the PyUnicodeObject type, new PyUnicode_InternImmortal() function:
commit 1680713
Author: Walter Dörwald <walter@livinglogic.de>
Date: Fri May 25 13:52:07 2007 +0000
Since Python 3.10, (mortal) interned strings are cleared at Python exit in Py_Finalize(). It avoids leaking memory when Python is embedded in an application: bpo-1635741.
commit 666ecfb
Author: Victor Stinner <vstinner@python.org>
Date: Thu Jul 2 01:19:57 2020 +0200
--
PyUnicode_InternImmortal() is not used in the Python standard library. I propose to start deprecating the function and remove it in Python 3.12 (PEP-387 requires a deprecation for 2 releases). In Python 3.10, calling the function will emit a DeprecationWarning at runtime.
Note: PyString_InternImmortal() (for bytes strings) has been removed from Python 3.0.
methane commentedon Sep 3, 2020
+1
corona10 commentedon Sep 3, 2020
+1
shihai1991 commentedon Sep 5, 2020
+1
vstinner commentedon Oct 1, 2020
I proposed PR 22486 to deprecate the function.
vstinner commentedon Oct 2, 2020
New changeset 583ee5a by Victor Stinner in branch 'master':
bpo-41692: Deprecate PyUnicode_InternImmortal() (GH-22486)
583ee5a
vstinner commentedon Oct 2, 2020
The function is now deprecated. Thanks for the review INADA-san, I close the issue. Let's meet in Python 3.12 to remove it ;-)
methane commentedon May 10, 2021
For the record, I noticed PyUnicode_InternImmortal() is a stable ABI.
We may need to keep the function to avoid dynamic link errors.
But we can still change its implementation to just raise an exception.
vstinner commentedon Dec 8, 2021
I cannot find "PyUnicode_InternImmortal" pattern in the source code of the PyPI top 5000 projects (December 1, 2021).
I only found a false positive in frozendict-2.1.1:
frozendict/src/3_10/cpython_src/Include/unicodeobject.h: // PyUnicode_InternImmortal() is deprecated since Python 3.10
frozendict/src/3_10/cpython_src/Include/unicodeobject.h: Py_DEPRECATED(3.10) PyAPI_FUNC(void) PyUnicode_InternImmortal(PyObject **);
frozendict/src/3_6/cpython_src/Include/unicodeobject.h: PyAPI_FUNC(void) PyUnicode_InternImmortal(PyObject **);
frozendict/src/3_7/cpython_src/Include/unicodeobject.h: PyAPI_FUNC(void) PyUnicode_InternImmortal(PyObject **);
frozendict/src/3_8/cpython_src/Include/unicodeobject.h: PyAPI_FUNC(void) PyUnicode_InternImmortal(PyObject **);
frozendict/src/3_9/cpython_src/Include/unicodeobject.h: PyAPI_FUNC(void) PyUnicode_InternImmortal(PyObject **);
These are copies of the Python unicodeobject.h header files, but the PyUnicode_InternImmortal() function is not called by frozendict.
I used my download_pypi_top.py and search_pypi_top.py tools which can be found at:
https://github.com/vstinner/misc/tree/main/cpython
gh-85858: Remove PyUnicode_InternImmortal() function (#92579)