| [ Web Proxy ] |
| Viewing: https://peps.python.org/687 | [Back] [Original] |
Extensions in the standard library will be converted to multi-phase initialization (PEP 489) and where possible, all state will be stored on module objects rather than in process-global variables.
Much of this proposal has already been implemented. We submit this PEP to explain the changes, seek consensus on whether they are good, propose the remaining changes, and set best practices for new modules.
The informational PEP 630 describes the background, motivation, rationale, implications and implementation notes of the proposed changes as they apply generally to any extension module (not just the standard library).
It is an integral part of this proposal. Read it first.
This PEP discusses specifics of the standard library.
The body of PEP 630 will be converted to a HOWTO in the Python documentation, and that PEP will be retired (marked Final).
All extension modules in the standard library will be converted to multi-phase initialization introduced in PEP 489.
All stdlib extension modules will be isolated. That is:
For example, _csv.field_size_limit will get/set a module-specific
number. On the other hand, functions like readline.get_history_item or
os.getpid will continue to work with state that is process-global
(external to the module, and possibly shared across other libraries, including
non-Python ones).
Static types that do not need module state access, and have no other reason to be converted, should stay static.
Types whose methods need access to their module instance will be converted to heap types following PEP 630, with the following considerations:
Py_TPFLAGS_IMMUTABLE_TYPE
flag to retain immutability.
See bpo-43908.Tests should ensure TypeError is raised when trying to create a new
attribute of an immutable type.
tp_new = NULL does not have a public constructor, but
heap types inherit the constructor from the base class. Make sure types that
previously were impossible to instantiate retain that feature; use
Py_TPFLAGS_DISALLOW_INSTANTIATION. Add tests using
test.support.check_disallow_instantiation(). See
bpo-43916.pickle-able). Test that calling pickle.dumps has the same result
before and after conversion, and if the test fails, add a __reduce__
method that raises TypeError. See PR-21002
for an example.These issues will be added to the Devguide to help any future conversions.
If another kind of issue is found, the module in question should be unchanged until a solution is found and added to the Devguide, and already converted modules are checked and fixed.
The following process should be added to the Devguide, and remain until all modules are converted. Any new findings should be documented there or in the general HOWTO.
pyperf is a good tool for benchmarking.Note: this is a suggested implementation plan for a complex module, based on lessons learned with other modules. Feel free to simplify it for smaller modules.
struct, add an instance
as a static global variable, and create helper stubs for fetching the module
state.struct, and modify code
that accesses the global state to use the module state helpers instead. This
step may be broken into several PRs.Steps 4 through 6 should preferably land in a single alpha development phase.
Extension modules in the standard library will now be loadable more than once.
For example, deleting such a module from sys.modules and re-importing it
will result in a fresh module instance, isolated from any previously loaded
instances.
This may affect code that expected the previous behavior: globals of extension modules were shallowly copied from the first loaded module.
None known.
A large part of this proposal is a HOWTO aimed at experienced users, which will be moved to the documentation.
Beginners should not be affected.
Most of the changes are now in the main branch, as commits for these issues:
As an example, changes and fix-ups done in the _csv module are:
This document is placed in the public domain or under the CC0-1.0-Universal license, whichever is more permissive.
Source: https://github.com/python/peps/blob/main/peps/pep-0687.rst
Last modified: 2026-06-15 17:28:27 UTC
| Web Proxy Viewer | New URL | Original Page |