After seeing #149318, I was curious as to what the effect would be when run with -X lazy_imports=none. To my surprise, I noticed that very little seems to work under the setting already.
For example, trying to run the test suite fails:
$ ./python -Xlazy_imports=none -m test
Exception ignored in the internal traceback machinery:
Traceback (most recent call last):
File "/home/peter/develop/cpython/Lib/traceback.py", line 15, in <module>
import tokenize
File "/home/peter/develop/cpython/Lib/tokenize.py", line 38, in <module>
lazy import _colorize
File "/home/peter/develop/cpython/Lib/_colorize.py", line 6, in <module>
from dataclasses import dataclass, field, Field
File "/home/peter/develop/cpython/Lib/dataclasses.py", line 5, in <module>
import annotationlib
File "/home/peter/develop/cpython/Lib/annotationlib.py", line 3, in <module>
import ast
File "/home/peter/develop/cpython/Lib/ast.py", line 24, in <module>
lazy from _colorize import can_colorize, get_theme
ImportError: cannot import name 'can_colorize' from partially initialized module '_colorize' (most likely due to a circular import) (/home/peter/develop/cpython/Lib/_colorize.py)
Traceback (most recent call last):
File "/home/peter/develop/cpython/Lib/runpy.py", line 201, in _run_module_as_main
return _run_code(code, main_globals, None,
File "/home/peter/develop/cpython/Lib/runpy.py", line 87, in _run_code
exec(code, run_globals)
File "/home/peter/develop/cpython/Lib/test/__main__.py", line 1, in <module>
from test.libregrtest.main import main
File "/home/peter/develop/cpython/Lib/test/libregrtest/main.py", line 8, in <module>
import trace
File "/home/peter/develop/cpython/Lib/trace.py", line 56, in <module>
import tokenize
File "/home/peter/develop/cpython/Lib/tokenize.py", line 38, in <module>
lazy import _colorize
File "/home/peter/develop/cpython/Lib/_colorize.py", line 6, in <module>
from dataclasses import dataclass, field, Field
File "/home/peter/develop/cpython/Lib/dataclasses.py", line 5, in <module>
import annotationlib
File "/home/peter/develop/cpython/Lib/annotationlib.py", line 3, in <module>
import ast
File "/home/peter/develop/cpython/Lib/ast.py", line 24, in <module>
lazy from _colorize import can_colorize, get_theme
ImportError: cannot import name 'can_colorize' from partially initialized module '_colorize' (most likely due to a circular import) (/home/peter/develop/cpython/Lib/_colorize.py)
The new REPL doesn't work:
$ ./python -X lazy_imports=none
Python 3.15.0a8+ (heads/pr_149318:6a88c2deeb3, May 3 2026, 10:35:20) [GCC 15.2.1 20260209] on linux
Type "help", "copyright", "credits" or "license" for more information.
Failed calling sys.__interactivehook__
Exception ignored in the internal traceback machinery:
Traceback (most recent call last):
File "/home/peter/develop/cpython/Lib/traceback.py", line 15, in <module>
import tokenize
File "/home/peter/develop/cpython/Lib/tokenize.py", line 38, in <module>
lazy import _colorize
File "/home/peter/develop/cpython/Lib/_colorize.py", line 170, in <module>
@dataclass(frozen=True, kw_only=True)
File "/home/peter/develop/cpython/Lib/dataclasses.py", line 1456, in wrap
return _process_class(cls, init, repr, eq, order, unsafe_hash,
File "/home/peter/develop/cpython/Lib/dataclasses.py", line 1064, in _process_class
cls_annotations = annotationlib.get_annotations(
AttributeError: module 'annotationlib' has no attribute 'get_annotations'
Traceback (most recent call last):
File "/home/peter/develop/cpython/Lib/site.py", line 513, in register_readline
import rlcompleter # noqa: F401
File "/home/peter/develop/cpython/Lib/rlcompleter.py", line 34, in <module>
import inspect
File "/home/peter/develop/cpython/Lib/inspect.py", line 146, in <module>
from annotationlib import Format, ForwardRef
File "/home/peter/develop/cpython/Lib/annotationlib.py", line 3, in <module>
import ast
File "/home/peter/develop/cpython/Lib/ast.py", line 24, in <module>
lazy from _colorize import can_colorize, get_theme
File "/home/peter/develop/cpython/Lib/_colorize.py", line 170, in <module>
@dataclass(frozen=True, kw_only=True)
File "/home/peter/develop/cpython/Lib/dataclasses.py", line 1456, in wrap
return _process_class(cls, init, repr, eq, order, unsafe_hash,
File "/home/peter/develop/cpython/Lib/dataclasses.py", line 1064, in _process_class
cls_annotations = annotationlib.get_annotations(
AttributeError: module 'annotationlib' has no attribute 'get_annotations'
warning: can't use pyrepl: module 'annotationlib' has no attribute 'get_annotations'
>>>
I compiled a list of all the standard library modules that currently don't work under -X lazy_imports=none:
- mailbox
- logging
- bdb
- pdb
- ast
- tokenize
- turtle
- ensurepip
- inspect
- unittest
- py_compile
- tabnanny
- code
- asyncio
- traceback
- antigravity
- contextlib
- doctest
- pathlib
- pstats
- compileall
- zipfile
- getpass
- zipapp
- pydoc
- webbrowser
- configparser
- subprocess
- venv
- rlcompleter
- pyclbr
- difflib
- trace
- annotationlib
- imaplib
- pickletools
- glob
I've already raised my concerns about this on DPO (in fact, LWN wrote an entire article about this), but anyway, what do we do? Do we consider this a bug? If so, how do we test for it? If not, then what is supposed to work? We should document the restrictions and expected behavior for disabling lazy imports.
Linked PRs
After seeing #149318, I was curious as to what the effect would be when run with -X lazy_imports=none. To my surprise, I noticed that very little seems to work under the setting already.
For example, trying to run the test suite fails:
The new REPL doesn't work:
I compiled a list of all the standard library modules that currently don't work under -X lazy_imports=none:
I've already raised my concerns about this on DPO (in fact, LWN wrote an entire article about this), but anyway, what do we do? Do we consider this a bug? If so, how do we test for it? If not, then what is supposed to work? We should document the restrictions and expected behavior for disabling lazy imports.
Linked PRs