MCPcopy Index your code
hub / github.com/huggingface/diffusers / _LazyModule

Class _LazyModule

src/diffusers/utils/import_utils.py:966–1023  ·  view source on GitHub ↗

Module class that surfaces all objects but only performs associated imports when the objects are requested.

Source from the content-addressed store, hash-verified

964
965
966class _LazyModule(ModuleType):
967 """
968 Module class that surfaces all objects but only performs associated imports when the objects are requested.
969 """
970
971 # Very heavily inspired by optuna.integration._IntegrationModule
972 # https://github.com/optuna/optuna/blob/master/optuna/integration/__init__.py
973 def __init__(self, name, module_file, import_structure, module_spec=None, extra_objects=None):
974 super().__init__(name)
975 self._modules = set(import_structure.keys())
976 self._class_to_module = {}
977 for key, values in import_structure.items():
978 for value in values:
979 self._class_to_module[value] = key
980 # Needed for autocompletion in an IDE
981 self.__all__ = list(import_structure.keys()) + list(chain(*import_structure.values()))
982 self.__file__ = module_file
983 self.__spec__ = module_spec
984 self.__path__ = [os.path.dirname(module_file)]
985 self._objects = {} if extra_objects is None else extra_objects
986 self._name = name
987 self._import_structure = import_structure
988
989 # Needed for autocompletion in an IDE
990 def __dir__(self):
991 result = super().__dir__()
992 # The elements of self.__all__ that are submodules may or may not be in the dir already, depending on whether
993 # they have been accessed or not. So we only add the elements of self.__all__ that are not already in the dir.
994 for attr in self.__all__:
995 if attr not in result:
996 result.append(attr)
997 return result
998
999 def __getattr__(self, name: str) -> Any:
1000 if name in self._objects:
1001 return self._objects[name]
1002 if name in self._modules:
1003 value = self._get_module(name)
1004 elif name in self._class_to_module.keys():
1005 module = self._get_module(self._class_to_module[name])
1006 value = getattr(module, name)
1007 else:
1008 raise AttributeError(f"module {self.__name__} has no attribute {name}")
1009
1010 setattr(self, name, value)
1011 return value
1012
1013 def _get_module(self, module_name: str):
1014 try:
1015 return importlib.import_module("." + module_name, self.__name__)
1016 except Exception as e:
1017 raise RuntimeError(
1018 f"Failed to import {self.__name__}.{module_name} because of the following error (look up to see its"
1019 f" traceback):\n{e}"
1020 ) from e
1021
1022 def __reduce__(self):
1023 return (self.__class__, (self._name, self.__file__, self._import_structure))

Callers 15

__init__.pyFile · 0.85
__init__.pyFile · 0.85
__init__.pyFile · 0.85
__init__.pyFile · 0.85
__init__.pyFile · 0.85
__init__.pyFile · 0.85
__init__.pyFile · 0.85
__init__.pyFile · 0.85
__init__.pyFile · 0.85
__init__.pyFile · 0.85
__init__.pyFile · 0.85
__init__.pyFile · 0.85

Calls

no outgoing calls

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…