Source code for qbraid._import

# Copyright (C) 2024 qBraid
#
# This file is part of the qBraid-SDK
#
# The qBraid-SDK is free software released under the GNU General Public License v3
# or later. You can redistribute and/or modify it under the terms of the GPL v3.
# See the LICENSE file in the project root or <https://www.gnu.org/licenses/gpl-3.0.html>.
#
# THERE IS NO WARRANTY for the qBraid-SDK, as per Section 15 of the GPL v3.
"""
Module used for lazy loading of submodules.

"""
import importlib
import types


[docs] class LazyLoader(types.ModuleType): """Lazily loads a module upon attribute access. This class acts as a proxy for a module, loading it only when an attribute of the module is accessed for the first time. Attributes: module_name (str): The full qualified name of the module to be lazily loaded. parent_globals (dict): The globals of the parent module, where this loader is used. module (module, optional): The loaded module. Initially set to None. Args: module_name (str): The full qualified name of the module to be lazily loaded. parent_globals (dict): The globals of the parent module. """
[docs] def __init__(self, module_name, parent_globals): super().__init__(module_name) self.module_name = module_name self.parent_globals = parent_globals self.module = None
def _load(self): """Load the module and insert it into the parent's globals.""" if not self.module: # Load the module and insert it into the parent's namespace self.module = importlib.import_module(self.module_name) self.parent_globals[self.__name__] = self.module # Update this object's dict for faster subsequent attribute access self.__dict__.update(self.module.__dict__) return self.module def __getattr__(self, item): return getattr(self._load(), item) def __dir__(self): return dir(self._load)