[ Web Proxy ]
URL:
Viewing: https://peps.python.org/687 [Back]  [Original]

PEP 687 Isolating modules in the standard library | peps.python.org Following system colour scheme Selected dark colour scheme Selected light colour scheme

Python Enhancement Proposals

Toggle light / dark / auto colour theme PEP 687 Isolating modules in the standard library

PEP 687 Isolating modules in the standard library

Author:
Erlend Egeberg Aasland <erlend at python.org>, Petr Viktorin <encukou at gmail.com>
Discussions-To:
Discourse thread
Status:
Final
Type:
Standards Track
Requires:
489, 573, 630
Created:
04-Apr-2022
Python-Version:
3.12
Post-History:
04-Apr-2022, 11-Apr-2022
Resolution:
Discourse message

Table of Contents

Abstract

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.

Note on Backdating

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.

Motivation & Rationale

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.

Specification

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:

Conversion to heap types

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:

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.

Process

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.

Part 1: Preparation

  1. Open a discussion, either on the bug tracker or on Discourse. Involve the module maintainer and/or code owner. Explain the reason and rationale for the changes.
  2. Identify global state performance bottlenecks. Create a proof-of-concept implementation, and measure the performance impact. pyperf is a good tool for benchmarking.
  3. Create an implementation plan. For small modules with few types, a single PR may do the job. For larger modules with lots of types, and possibly also external library callbacks, multiple PRs will be needed.

Part 2: Implementation

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.

  1. Add Argument Clinic where possible; it enables you to easily use the defining class to fetch module state from type methods.
  2. Prepare for module state; establish a module state struct, add an instance as a static global variable, and create helper stubs for fetching the module state.
  3. Add relevant global variables to 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.
  4. Where necessary, convert static types to heap types.
  5. Convert the global module state struct to true module state.
  6. Implement multi-phase initialisation.

Steps 4 through 6 should preferably land in a single alpha development phase.

Backwards Compatibility

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.

Security Implications

None known.

How to Teach This

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.

Reference Implementation

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:

Copyright

This document is placed in the public domain or under the CC0-1.0-Universal license, whichever is more permissive.

Contents


Page Source (GitHub)

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