Source code for voxcity.utils.lazy
"""Lazy third-party module loading built on ``importlib.util.LazyLoader``."""
import importlib.util
import sys
[docs]
def lazy_import(name: str):
"""Return module ``name`` without executing it until first attribute access.
Already-imported modules are returned as-is. A missing module raises
``ModuleNotFoundError`` immediately at the call site, so optional
dependencies still fail with a clear error where they are declared.
"""
if name in sys.modules:
return sys.modules[name]
spec = importlib.util.find_spec(name)
if spec is None or spec.loader is None:
raise ModuleNotFoundError(f"No module named {name!r}")
spec.loader = importlib.util.LazyLoader(spec.loader)
module = importlib.util.module_from_spec(spec)
sys.modules[name] = module
spec.loader.exec_module(module)
return module