diff --git a/Lib/test/test_import/__init__.py b/Lib/test/test_import/__init__.py index 4526a6d8953..4eecec588be 100644 --- a/Lib/test/test_import/__init__.py +++ b/Lib/test/test_import/__init__.py @@ -2558,6 +2558,25 @@ def test_basic_unused(self): self.assertFalse("test.test_import.data.lazy_imports.basic2" in sys.modules) + def test_basic_unused_dir(self): + try: + import test.test_import.data.lazy_imports.basic_unused + except ImportError as e: + self.fail('lazy import failed') + + x = dir(test.test_import.data.lazy_imports.basic_unused) + self.assertIn("test", x) + self.assertFalse("test.test_import.data.lazy_imports.basic2" in sys.modules) + + def test_basic_dir(self): + try: + from test.test_import.data.lazy_imports import basic_dir + except ImportError as e: + self.fail('lazy import failed') + + self.assertIn("test", basic_dir.x) + self.assertFalse("test.test_import.data.lazy_imports.basic2" in sys.modules) + def test_basic_used(self): try: import test.test_import.data.lazy_imports.basic_used diff --git a/Lib/test/test_import/data/lazy_imports/basic_dir.py b/Lib/test/test_import/data/lazy_imports/basic_dir.py new file mode 100644 index 00000000000..ca9e29d3d99 --- /dev/null +++ b/Lib/test/test_import/data/lazy_imports/basic_dir.py @@ -0,0 +1,2 @@ +lazy import test.test_import.data.lazy_imports.basic2 +x = dir() diff --git a/Objects/moduleobject.c b/Objects/moduleobject.c index 305300e07ec..aecd66f9c13 100644 --- a/Objects/moduleobject.c +++ b/Objects/moduleobject.c @@ -1259,7 +1259,12 @@ static PyObject * module_dir(PyObject *self, PyObject *args) { PyObject *result = NULL; - PyObject *dict = PyObject_GetAttr(self, &_Py_ID(__dict__)); + PyObject *dict; + if (PyModule_CheckExact(self)) { + dict = Py_NewRef(((PyModuleObject *)self)->md_dict); + } else { + dict = PyObject_GetAttr(self, &_Py_ID(__dict__)); + } if (dict != NULL) { if (PyDict_Check(dict)) {