import importlib class LazyModule: def __init__(self, name, pip_name=None, import_error_msg=None): self.name = name self.pip_name = pip_name or name self.import_error_msg = import_error_msg or ( f"This requires the {self.name} module. " f"You can install it via `pip install {self.pip_name}`" ) self.module = None self._available = None @property def available(self): if self._available is None: try: self.initialize() self._available = True except ImportError: self._available = False return self._available def initialize(self): try: self.module = importlib.import_module(self.name) except ImportError: raise ImportError(self.import_error_msg) def __getattr__(self, name): if name == "_api_export_path": raise AttributeError if self.module is None: self.initialize() return getattr(self.module, name) def __repr__(self): return f"LazyModule({self.name})" tensorflow = LazyModule("tensorflow") gfile = LazyModule("tensorflow.io.gfile", pip_name="tensorflow") tensorflow_io = LazyModule("tensorflow_io") scipy = LazyModule("scipy") jax = LazyModule("jax") torch_xla = LazyModule( "torch_xla", import_error_msg=( "This requires the torch_xla module. You can install it via " "`pip install torch-xla`. Additionally, you may need to update " "LD_LIBRARY_PATH if necessary. Torch XLA builds a shared library, " "_XLAC.so, which needs to link to the version of Python it was built " "with. Use the following command to update LD_LIBRARY_PATH: " "`export LD_LIBRARY_PATH=/lib:$LD_LIBRARY_PATH`" ), ) optree = LazyModule("optree") dmtree = LazyModule("tree") tf2onnx = LazyModule("tf2onnx")