Spaces:
Running
on
Zero
Running
on
Zero
""" | |
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/util/lazy_loader.py | |
""" | |
import importlib | |
import types | |
class LazyLoader(types.ModuleType): | |
"""Lazily import a module, mainly to avoid pulling in large dependencies. | |
`paddle`, and `ffmpeg` are examples of modules that are large and not always | |
needed, and this allows them to only be loaded when they are used. | |
""" | |
# The lint error here is incorrect. | |
def __init__(self, local_name, parent_module_globals, name, warning=None): | |
self._local_name = local_name | |
self._parent_module_globals = parent_module_globals | |
self._warning = warning | |
# These members allows doctest correctly process this module member without | |
# triggering self._load(). self._load() mutates parant_module_globals and | |
# triggers a dict mutated during iteration error from doctest.py. | |
# - for from_module() | |
self.__module__ = name.rsplit(".", 1)[0] | |
# - for is_routine() | |
self.__wrapped__ = None | |
super(LazyLoader, self).__init__(name) | |
def _load(self): | |
"""Load the module and insert it into the parent's globals.""" | |
# Import the target module and insert it into the parent's namespace | |
module = importlib.import_module(self.__name__) | |
self._parent_module_globals[self._local_name] = module | |
# Emit a warning if one was specified | |
if self._warning: | |
# logging.warning(self._warning) | |
# Make sure to only warn once. | |
self._warning = None | |
# Update this object's dict so that if someone keeps a reference to the | |
# LazyLoader, lookups are efficient (__getattr__ is only called on lookups | |
# that fail). | |
self.__dict__.update(module.__dict__) | |
return module | |
def __getattr__(self, item): | |
module = self._load() | |
return getattr(module, item) | |
def __repr__(self): | |
# Carefully to not trigger _load, since repr may be called in very | |
# sensitive places. | |
return f"<LazyLoader {self.__name__} as {self._local_name}>" | |
def __dir__(self): | |
module = self._load() | |
return dir(module) | |
# import paddle.nn as nn | |
# nn = LazyLoader("nn", globals(), "paddle.nn") | |
# class M(nn.Layer): | |
# def __init__(self) -> None: | |
# super().__init__() | |