-
-
Notifications
You must be signed in to change notification settings - Fork 30.8k
New issue
Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? # to your account
tp_dict
slot of static builtin types is NULL
in 3.12, without mention in the changelog or an alternative
#105227
Comments
@Yhg1s : Would it be acceptable to introduce such a new API in an upcoming 3.12 beta release? |
@Yhg1s, I've added the deferred blocker label because this issue is a seemingly intentional regression from 3.11 without a documented replacement. I'm currently using a private API and that doesn't feel right. |
FWIW, I'm in favor of adding |
I agree that its is better to return a new reference instead of a borrowed reference in APIs like this, but that can make life harder for anyone transitioning to the new way of working. In my particular case it does make transitioning harder because I'll have to add refcount updates where I didn't have to do before. That said, this is not a big problem. |
This compensates for static builtin types having `tp_dict` set to `NULL`. (cherry picked from commit a840806) Co-authored-by: Eric Snow <ericsnowcurrently@gmail.com> Co-authored-by: Petr Viktorin <encukou@gmail.com>
This compensates for static builtin types having `tp_dict` set to `NULL`. Co-authored-by: Petr Viktorin <encukou@gmail.com>
@ericsnowcurrently, when you get back, could you review (and maybe improve) the docs? |
The docs seem fine to me, after your changes. My original changes were likely unnecessarily specific. :) Was there something in particular you were concerned about? |
If you think more should be done, feel free to re-open this. |
See python/cpython#105227 Signed-off-by: Emanuele Giaquinta <emanuele.giaquinta@gmail.com>
PyObjC contains some functionality that needs to walk the entire MRO of classes and access the
tp_dict
slot. As of Python 3.12 beta 1 this code crashes due to the slot beingNULL
on static builtin types.The code in PyObjC walks the MRO to implement
tp_getattro
for the proxy of Objective-C classes to replicatePyObject_GenericGetAttr
with some customisations, as wel as in the implementation of an alternative tosuper
(again with customisations in the attribute resolution path). All code paths only need read-only access to thetp_dict
of static builtin types, although some code needs to be able to update thetp_dict
of classes created by PyObjC.There is currently no documented alternative for directly accessing
tp_dict
, and because of this I've changed PyObjC to use the private API_PyType_GetDict
.Some alternatives I've looked into:
Use
PyObject_GetAttrString(someType, "__dict__")
: This increases the complexity of the PyObjC code bases and requires changes to long stable code:Needs to introduce a different code path for accessing the
__dict__
slot of non-PyObjC subclassesNeeds to switch to the abstract Mapping API instead of the PyDict API, which likely has a performance impact
Changes to reference counting invariants in the code
Use
_PyType_GetDict
on Python 3.12 or later: This works, but introduces a reliance on a private CPython API that might disappear at any moment (even micro releases), for example by no longer exporting the function from shared libraries.Proposal: Rename
_PyType_GetDict
to eitherPyUnstable_Type_GetDict
orPyType_GetDict
, while keeping the current interface (e.g. returning a borrowed reference and never raising an exception).This is a follow-up from #105020
@ericsnowcurrently
Linked PRs
The text was updated successfully, but these errors were encountered: