[Import-SIG] PEP 489: Redesigning extension module loading
Stefan Behnel
stefan_ml at behnel.de
Fri Apr 17 08:51:34 CEST 2015
Petr Viktorin schrieb am 16.04.2015 um 13:05:
> A wart I added is "singleton modules", necessary for
> "PyState_FindModule"-like functionality. I wouldn't mind not including
> this, but it would mean the new API can't replace all use cases of the
> old PyInit_.
>
> Singleton Modules
> -----------------
>
> Modules defined by PyModuleDef may be registered with PyState_AddModule,
> and later retrieved with PyState_FindModule.
>
> Under the new API, there is no one-to-one mapping between PyModuleSpec
> and the module created from it.
> In particular, multiple modules may be loaded from the same description.
Is that because a single shared library (which is what the module spec
refers to, right?) can contain multiple modules? Or are you referring to
something else here?
> This means that there is no "global" instance of a module object.
> Any C-level callbacks that need access to the module state need to be passed
> a reference to the module object, either directly or indirectly.
>
>
> However, there are some modules that really need to be only loaded once:
> typically ones that wrap a C library with global state.
> These modules should set the PyModule_EXPORT_SINGLETON flag
> in PyModuleDesc.flags. When this flag is set, loading an additional
> copy of the module after it has been loaded once will return the previously
> loaded object.
> This will be done on a low level, using _PyImport_FixupExtensionObject.
> Additionally, the module will be automatically registered using
> PyState_AddSingletonModule (see below) after execution slots are processed.
>
> Singleton modules can be retrieved, registered or unregistered with
> the interpreter state using three new functions, which parallel their
> PyModuleDef counterparts, PyState_FindModule, PyState_AddModule,
> and PyState_RemoveModule::
>
> PyObject* PyState_FindSingletonModule(PyModuleDesc *desc)
> int PyState_AddSingletonModule(PyObject *module, PyModuleDesc *desc)
> int PyState_RemoveSingletonModule(PyModuleDesc *desc)
>
>
> .. note::
>
> If PyModuleDef is used instead of PyModuleDesc, the flag would be specified
> as a slot with NULL value, i.e. ``{Py_mod_flag_singleton, NULL}``.
> In this case, PyState_FindModule, PyState_AddModule and
> PyState_RemoveModule can be used instead of the new functions.
>
> .. note::
>
> Another possibility is to use PyModuleDef_Base in PyModuleDesc, and
> have PyState_FindModule and friends work with either of the two structures.
Yes, this is totally a wart. However, I'm not sure I understand the actual
use case from what is written above. Could you clarify why this whole
special case is needed?
Stefan
More information about the Import-SIG
mailing list