Implement PEP 793 – PyModExport
Feature or enhancement
Proposal:
See PEP 793. I'll copy the abstract for reference:
In this PEP, we propose a new entry point for C extension modules, by which one can define a module using an array of
PyModuleDef_Slotstructures without an enclosingPyModuleDefstructure. This allows extension authors to avoid using a statically allocatedPyObject, lifting the most common obstacle to making one compiled library file usable with both regular and free-threaded builds of CPython.To make this viable, we also specify new module slot types to replace
PyModuleDef’s fields, and to allow adding a token similar to thePy_tp_tokenused for type objects.We also add an API for defining modules from slots dynamically.
The existing API (
PyInit_*) is soft-deprecated. (That is: it will continue to work without warnings, and it’ll be fully documented and supported, but we plan to not add any new features to it.)
- [x] Initial implementation (#140556)
- [ ] Docs:
- [x] Reference docs (#141197)
- [x] Soft-deprecate
PyInit_*(#141197) - [x] Better explanation of module state (#141197)
- [x] Give an example for tokens (#141197)
- [x] Soft-deprecate
- [ ] What's New
- [ ] a notice for
DYNLOADFILEusers
- [ ] a notice for
- [ ] Porting guide HOWTO
- [ ] Document that the export hook runs without GIL in FT builds (see
#141780)
- [ ] Document that the export hook runs without GIL in FT builds (see
- [ ] Tutorial update
- [ ] Mentions in
PyImport_AppendInittab& friends - [ ] Make sure references to new API are linked:
- [x]
PyMod_ExecinPyImport_CreateModuleFromInitfuncdocs is linked (#141197) - [ ]
PyMODEXPORT_FUNCin blurb for#141672 - [ ] blurb for
#141780
- [x]
- [x] Reference docs (#141197)
- [ ]
xxlimited.cupdate (#142827)- [ ] Remove/replace
_Py_OPAQUE_PYOBJECTinxxlimited.c(by 3.15.0 beta)
- [ ] Remove/replace
Optional stretch goals:
- [ ] Remove the
PyInitfunction fromLib/test/test_cext/extension.c(https://github.com/python/cpython/pull/141511) - [ ] Speed & size improvements
- [ ]
importdl: load the DLL once - [x]
boolfor the GIL flag (#141519)
- [ ]
- [ ] No longer require
spec.nameinPyModule_FromSlotsAndSpec - [ ] No longer require static allocation for
Py_mod_methods - [ ] Add a
PyModule_GetStateWithToken()function
Has this already been discussed elsewhere?
No response given
Links to previous discussion of this feature:
No response
Linked PRs
- gh-140556
- gh-141056
- gh-141197
- gh-141511
- gh-141519
- gh-142583
- gh-142827
See also:
- gh-141672
I'd appreciate a review of the reference docs update: #141197