From b2f0ebbf75ce96ad7e8f82ff07b5cd4be10e2bf1 Mon Sep 17 00:00:00 2001 From: Anton Sivkov Date: Thu, 17 Oct 2024 18:58:24 +0400 Subject: [PATCH] bugfix wrong exception in lazy import __getattr__ (#15739) --- src/prefect/__init__.py | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/src/prefect/__init__.py b/src/prefect/__init__.py index dad5e2ecf45e..705b9fcef35f 100644 --- a/src/prefect/__init__.py +++ b/src/prefect/__init__.py @@ -102,17 +102,20 @@ def __getattr__(attr_name: str) -> object: if attr_name in _slots: return _slots[attr_name] - - dynamic_attr = _public_api.get(attr_name) - if dynamic_attr is None: - return importlib.import_module(f".{attr_name}", package=__name__) - - package, module_name = dynamic_attr - - from importlib import import_module - - if module_name == "__module__": - return import_module(f".{attr_name}", package=package) - else: - module = import_module(module_name, package=package) - return getattr(module, attr_name) + try: + dynamic_attr = _public_api.get(attr_name) + if dynamic_attr is None: + return importlib.import_module(f".{attr_name}", package=__name__) + + package, module_name = dynamic_attr + + from importlib import import_module + + if module_name == "__module__": + return import_module(f".{attr_name}", package=package) + else: + module = import_module(module_name, package=package) + return getattr(module, attr_name) + except ModuleNotFoundError as ex: + module, _, attribute = ex.name.rpartition(".") + raise AttributeError(f"module {module} has no attribute {attribute}") from ex