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
{{ message }}
Repository navigation
Add an API for determining if an object is immortal #128509
Immortal objects might lead to some unexpected results for users that are (unfortunately) messing with reference count details, as seen in #127191; but currently, there's no way to determine what objects are actually immortal.
Immortality is an implementation detail, but it still does affect reference counting, and given that it's not very safe to rely on very specific reference counts, we don't want the only way to check for immortality to be via sys.getrefcount. So, given that we already have sys._is_interned, it seems fitting to add a sys._is_immortal alongside it.
If we go with this, I think it's also a good idea to note it in some of the documentation. For example, sys.getrefcount says this:
some objects are immortal and have a very high refcount that does not reflect the actual number of references.
Here, it might be a good idea to mention my proposed sys._is_immortal, so there's less ambiguity about the returned value.
Immortality is an implementation detail, but it still does affect reference counting, and given that it's not very safe to rely on very specific reference counts, we don't want the only way to check for immortality to be via sys.getrefcount. So, given that we already have sys._is_interned, it seems fitting to add a sys._is_immortal alongside it.
What is the use-case to check if something is immortal at python level? Adding it for consistency reason alone isn't enough as it a very specific impl detail of CPython. I would like to know the use case before exposing it at Python level.
Reacted by Erlend E. Aasland, Peter Bierma and Petr Viktorin
Differentiating between "a lot of references" and an immortal object (e.g. for debugging). It's not a good idea to have users rely on an object having a specific number of references to declare it immortal, because we change the immortal reference count, and objects with deferred reference counts also have "very large" reference counts. (FWIW, immortality might not even be done with a fixed refcount someday--that's not something we can deprecate at a sys.getrefcount level.)
What is the use-case to check if something is immortal at python level?
Writing unit tests I would say.
Since sys.getrefcount() is public, IMO it makes sense to add sys._is_immortal(). We should not and cannot hide this "implementation detail". It's not a minor detail, it does confuse a lot of people (me included!).
Activity
kumaraditya303 commentedon Jan 5, 2025
What is the use-case to check if something is immortal at python level? Adding it for consistency reason alone isn't enough as it a very specific impl detail of CPython. I would like to know the use case before exposing it at Python level.
ZeroIntensity commentedon Jan 5, 2025
Differentiating between "a lot of references" and an immortal object (e.g. for debugging). It's not a good idea to have users rely on an object having a specific number of references to declare it immortal, because we change the immortal reference count, and objects with deferred reference counts also have "very large" reference counts. (FWIW, immortality might not even be done with a fixed refcount someday--that's not something we can deprecate at a
sys.getrefcountlevel.)vstinner commentedon Jan 22, 2025
Maybe we could start by adding a C API for that?
PyUnstable_IsImmortal()or evenPy_IsImmortal()?vstinner commentedon Jan 22, 2025
@kumaraditya303:
Writing unit tests I would say.
Since
sys.getrefcount()is public, IMO it makes sense to addsys._is_immortal(). We should not and cannot hide this "implementation detail". It's not a minor detail, it does confuse a lot of people (me included!).gh-128509: Add `PyUnstable_IsImmortal` for finding immortal objects (G…
gh-128509: Add `sys._is_immortal` for identifying immortal objects (#…
pythongh-128509: Add `sys._is_immortal` for identifying immortal obje…
gh-128509: Use bytes singletons in marshal (#157398)
[3.14] gh-128509: Use bytes singletons in marshal (GH-157398) (#157432)
gh-128509: Add tests on sys._is_immortal() (#157376)
[3.14] gh-128509: Add tests on sys._is_immortal() (GH-157376) (#157446)
pythongh-128509: Use bytes singletons in marshal (python#157398)
pythongh-128509: Add tests on sys._is_immortal() (python#157376)
[3.15] gh-128509: Use bytes singletons in marshal (GH-157398) (#157433)
[3.15] gh-128509: Add tests on sys._is_immortal() (GH-157376) (#157445)