https://github.com/python/cpython/commit/a5b9d60a69d9ca281f956d5ec48fcaededd1b94b
commit: a5b9d60a69d9ca281f956d5ec48fcaededd1b94b
branch: main
author: Bartosz Sławecki <[email protected]>
committer: DinoV <[email protected]>
date: 2026-03-27T14:37:11-07:00
summary:
gh-145059: Record lazy modules without submodules in `sys.lazy_modules`
(#146081)
Record simple lazy modules as well
files:
A
Misc/NEWS.d/next/Core_and_Builtins/2026-03-17-14-20-56.gh-issue-145059.aB3xKm.rst
M Lib/test/test_lazy_import/__init__.py
M Python/import.c
diff --git a/Lib/test/test_lazy_import/__init__.py
b/Lib/test/test_lazy_import/__init__.py
index 6e53e2c042bc16..69cb96cf4a0c1a 100644
--- a/Lib/test/test_lazy_import/__init__.py
+++ b/Lib/test/test_lazy_import/__init__.py
@@ -969,6 +969,21 @@ def test_lazy_modules_is_per_interpreter(self):
# Basic test that sys.lazy_modules exists and is a dict
self.assertIsInstance(sys.lazy_modules, dict)
+ def test_lazy_module_without_children_is_tracked(self):
+ code = textwrap.dedent("""
+ import sys
+ lazy import json
+ assert "json" in sys.lazy_modules, (
+ f"expected 'json' in sys.lazy_modules, got
{set(sys.lazy_modules)}"
+ )
+ assert sys.lazy_modules["json"] == set(), (
+ f"expected empty set for sys.lazy_modules['json'], "
+ f"got {sys.lazy_modules['json']!r}"
+ )
+ print("OK")
+ """)
+ assert_python_ok("-c", code)
+
@support.requires_subprocess()
class CommandLineAndEnvVarTests(unittest.TestCase):
diff --git
a/Misc/NEWS.d/next/Core_and_Builtins/2026-03-17-14-20-56.gh-issue-145059.aB3xKm.rst
b/Misc/NEWS.d/next/Core_and_Builtins/2026-03-17-14-20-56.gh-issue-145059.aB3xKm.rst
new file mode 100644
index 00000000000000..e2db5a83a1a9e3
--- /dev/null
+++
b/Misc/NEWS.d/next/Core_and_Builtins/2026-03-17-14-20-56.gh-issue-145059.aB3xKm.rst
@@ -0,0 +1 @@
+Fixed ``sys.lazy_modules`` to include lazy modules without submodules. Patch
by Bartosz Sławecki.
diff --git a/Python/import.c b/Python/import.c
index f615fe37ba8fbe..e298fbee536c1b 100644
--- a/Python/import.c
+++ b/Python/import.c
@@ -4377,6 +4377,12 @@ register_lazy_on_parent(PyThreadState *tstate, PyObject
*name,
Py_ssize_t dot = PyUnicode_FindChar(name, '.', 0,
PyUnicode_GET_LENGTH(name), -1);
if (dot < 0) {
+ PyObject *lazy_submodules = ensure_lazy_submodules(
+ (PyDictObject *)lazy_modules, name);
+ if (lazy_submodules == NULL) {
+ goto done;
+ }
+ Py_DECREF(lazy_submodules);
ret = 0;
goto done;
}
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]