From 5a7a4f29fcba0a9b07f12f7f3d2f6b15b0c02ec4 Mon Sep 17 00:00:00 2001 From: johnslavik Date: Sun, 15 Feb 2026 22:39:43 +0100 Subject: [PATCH 1/6] Fix `__lazy_import__` crash --- Python/import.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Python/import.c b/Python/import.c index c20c55727d2f94..22e9ba36390e7b 100644 --- a/Python/import.c +++ b/Python/import.c @@ -4501,6 +4501,9 @@ _PyImport_LazyImportModuleLevelObject(PyThreadState *tstate, assert(!PyErr_Occurred()); modname = Py_NewRef(Py_None); } + if (fromlist == NULL) { + fromlist = Py_NewRef(Py_None); + } PyObject *args[] = {modname, name, fromlist}; PyObject *res = PyObject_Vectorcall(filter, args, 3, NULL); From c0323cccf46cc9cc1a692e17d7fb9783f8b2d7cd Mon Sep 17 00:00:00 2001 From: johnslavik Date: Fri, 27 Feb 2026 21:24:09 +0100 Subject: [PATCH 2/6] Add the crashing test case --- Lib/test/test_import/test_lazy_imports.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Lib/test/test_import/test_lazy_imports.py b/Lib/test/test_import/test_lazy_imports.py index 1193af9589034b..3127395aea3a1c 100644 --- a/Lib/test/test_import/test_lazy_imports.py +++ b/Lib/test/test_import/test_lazy_imports.py @@ -386,6 +386,11 @@ def test_dunder_lazy_import(self): import test.test_import.data.lazy_imports.dunder_lazy_import self.assertNotIn("test.test_import.data.lazy_imports.basic2", sys.modules) + def test_dunder_lazy_import_with_custom_filter(self): + sys.set_lazy_imports_filter(lambda importer, imported, fromlist: False) + import test.test_import.data.lazy_imports.dunder_lazy_import + self.assertIn("test.test_import.data.lazy_imports.basic2", sys.modules) + def test_dunder_lazy_import_used(self): """Using __lazy_import__ result should trigger module load.""" import test.test_import.data.lazy_imports.dunder_lazy_import_used From a23d40e9adc6aba81f4ff17db7f301e3083dab19 Mon Sep 17 00:00:00 2001 From: johnslavik Date: Fri, 27 Feb 2026 21:27:09 +0100 Subject: [PATCH 3/6] Add invariant check --- Python/import.c | 1 + 1 file changed, 1 insertion(+) diff --git a/Python/import.c b/Python/import.c index 22e9ba36390e7b..48f9a3d2810280 100644 --- a/Python/import.c +++ b/Python/import.c @@ -4502,6 +4502,7 @@ _PyImport_LazyImportModuleLevelObject(PyThreadState *tstate, modname = Py_NewRef(Py_None); } if (fromlist == NULL) { + assert(!PyErr_Occurred()); fromlist = Py_NewRef(Py_None); } PyObject *args[] = {modname, name, fromlist}; From cbcd0b90274576a207ca7dc7670cd90ce924e144 Mon Sep 17 00:00:00 2001 From: johnslavik Date: Fri, 27 Feb 2026 22:18:26 +0100 Subject: [PATCH 4/6] Add a test that obviously fails --- Lib/test/test_import/test_lazy_imports.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Lib/test/test_import/test_lazy_imports.py b/Lib/test/test_import/test_lazy_imports.py index 3127395aea3a1c..d432b4fc26725c 100644 --- a/Lib/test/test_import/test_lazy_imports.py +++ b/Lib/test/test_import/test_lazy_imports.py @@ -381,6 +381,9 @@ def tearDown(self): sys.set_lazy_imports_filter(None) sys.set_lazy_imports("normal") + def test_that_fails(self): + self.assertTrue(False) + def test_dunder_lazy_import(self): """__lazy_import__ should create lazy import proxy.""" import test.test_import.data.lazy_imports.dunder_lazy_import From d2f709de1e827c1865532f9fe2dd33fde88057d8 Mon Sep 17 00:00:00 2001 From: johnslavik Date: Fri, 27 Feb 2026 23:05:50 +0100 Subject: [PATCH 5/6] Revert "Add a test that obviously fails" This reverts commit cbcd0b90274576a207ca7dc7670cd90ce924e144. --- Lib/test/test_import/test_lazy_imports.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/Lib/test/test_import/test_lazy_imports.py b/Lib/test/test_import/test_lazy_imports.py index d432b4fc26725c..3127395aea3a1c 100644 --- a/Lib/test/test_import/test_lazy_imports.py +++ b/Lib/test/test_import/test_lazy_imports.py @@ -381,9 +381,6 @@ def tearDown(self): sys.set_lazy_imports_filter(None) sys.set_lazy_imports("normal") - def test_that_fails(self): - self.assertTrue(False) - def test_dunder_lazy_import(self): """__lazy_import__ should create lazy import proxy.""" import test.test_import.data.lazy_imports.dunder_lazy_import From 4803e61f5adf8da616999a4d30c7e18ce588957d Mon Sep 17 00:00:00 2001 From: johnslavik Date: Sat, 28 Feb 2026 04:04:57 +0100 Subject: [PATCH 6/6] Fixup lazy import after merge --- Lib/test/test_lazy_import/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_lazy_import/__init__.py b/Lib/test/test_lazy_import/__init__.py index 1529e067d2309d..5d30ec2299789b 100644 --- a/Lib/test/test_lazy_import/__init__.py +++ b/Lib/test/test_lazy_import/__init__.py @@ -393,8 +393,8 @@ def test_dunder_lazy_import(self): def test_dunder_lazy_import_with_custom_filter(self): sys.set_lazy_imports_filter(lambda importer, imported, fromlist: False) - import test.test_import.data.lazy_imports.dunder_lazy_import - self.assertIn("test.test_import.data.lazy_imports.basic2", sys.modules) + import test.test_lazy_import.data.dunder_lazy_import + self.assertIn("test.test_lazy_import.data.basic2", sys.modules) def test_dunder_lazy_import_used(self): """Using __lazy_import__ result should trigger module load."""