diff --git a/Lib/test/test_lazy_import/__init__.py b/Lib/test/test_lazy_import/__init__.py index fd74ce6827fcca..6dd2f7c825e5dd 100644 --- a/Lib/test/test_lazy_import/__init__.py +++ b/Lib/test/test_lazy_import/__init__.py @@ -770,6 +770,20 @@ def test_dunder_lazy_import_invalid_arguments(self): b"TypeError: Item in ``from list'' must be str, not int", result.err) + @support.requires_subprocess() + def test_dunder_lazy_import_explicit_none(self): + """__lazy_import__ should accept None for globals and locals.""" + code = textwrap.dedent(""" + import sys + import types + + lazy = __lazy_import__("test.test_lazy_import.data.basic2", + globals=None, locals=None) + assert type(globals()["lazy"]) is types.LazyImportType + assert "test.test_lazy_import.data.basic2" not in sys.modules + """) + assert_python_ok("-c", code) + def test_dunder_lazy_import_builtins(self): """__lazy_import__ should use module's __builtins__ for __import__.""" from test.test_lazy_import.data import dunder_lazy_import_builtins diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-11-03-05-52-49.gh-issue-161229.8pOPOI.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-11-03-05-52-49.gh-issue-161229.8pOPOI.rst new file mode 100644 index 00000000000000..3a9eae1e4af91b --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2026-11-03-05-52-49.gh-issue-161229.8pOPOI.rst @@ -0,0 +1,2 @@ +:func:`!__lazy_import__` now treats ``None`` for *globals* and *locals* the +same as omitting them, matching its signature. diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index 5413e57754667f..3018ab1a380cc5 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -312,7 +312,7 @@ builtin___lazy_import___impl(PyObject *module, PyObject *name, { PyObject *builtins; PyThreadState *tstate = PyThreadState_GET(); - if (globals == NULL) { + if (globals == NULL || globals == Py_None) { globals = PyEval_GetGlobals(); if (globals == NULL) { PyErr_SetString(PyExc_TypeError, @@ -321,7 +321,7 @@ builtin___lazy_import___impl(PyObject *module, PyObject *name, return NULL; } } - if (locals == NULL) { + if (locals == NULL || locals == Py_None) { locals = globals; }