From 4c5f06c27b4c5bb6eb1b58143c8fa725c3014f83 Mon Sep 17 00:00:00 2001 From: Steven Silvester Date: Wed, 1 May 2024 16:21:40 -0500 Subject: [PATCH 1/2] PYTHON-4424 Add workaround for ModuleNotFoundError TypeError --- pymongo/_lazy_import.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/pymongo/_lazy_import.py b/pymongo/_lazy_import.py index 6e6d59a028..315c3a147f 100644 --- a/pymongo/_lazy_import.py +++ b/pymongo/_lazy_import.py @@ -26,9 +26,15 @@ def lazy_import(name: str) -> ModuleType: try: spec = importlib.util.find_spec(name) except ValueError: - raise ModuleNotFoundError(name=name) from None + try: + raise ModuleNotFoundError(name=name) from None + except TypeError: # Workaround for PYTHON-4424 + raise ModuleNotFoundError() from None if spec is None: - raise ModuleNotFoundError(name=name) + try: + raise ModuleNotFoundError(name=name) + except TypeError: # Workaround for PYTHON-4424 + raise ModuleNotFoundError() from None assert spec is not None loader = importlib.util.LazyLoader(spec.loader) # type:ignore[arg-type] spec.loader = loader From ff950f03fa91c389924ae2d830368c490db30fb9 Mon Sep 17 00:00:00 2001 From: Steven Silvester Date: Thu, 2 May 2024 06:03:02 -0500 Subject: [PATCH 2/2] update based on experimentation --- pymongo/_lazy_import.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/pymongo/_lazy_import.py b/pymongo/_lazy_import.py index 315c3a147f..888339d034 100644 --- a/pymongo/_lazy_import.py +++ b/pymongo/_lazy_import.py @@ -23,18 +23,17 @@ def lazy_import(name: str) -> ModuleType: From https://docs.python.org/3/library/importlib.html#implementing-lazy-imports """ + # Workaround for PYTHON-4424. + if "__compiled__" in globals(): + return importlib.import_module(name) try: spec = importlib.util.find_spec(name) except ValueError: - try: - raise ModuleNotFoundError(name=name) from None - except TypeError: # Workaround for PYTHON-4424 - raise ModuleNotFoundError() from None + # Note: this cannot be ModuleNotFoundError, see PYTHON-4424. + raise ImportError(name=name) from None if spec is None: - try: - raise ModuleNotFoundError(name=name) - except TypeError: # Workaround for PYTHON-4424 - raise ModuleNotFoundError() from None + # Note: this cannot be ModuleNotFoundError, see PYTHON-4424. + raise ImportError(name=name) assert spec is not None loader = importlib.util.LazyLoader(spec.loader) # type:ignore[arg-type] spec.loader = loader