Skip to content

Instantly share code, notes, and snippets.

@rudaoshi
Created January 31, 2022 09:38
Show Gist options
  • Save rudaoshi/5a620b9f38a38dd5f4de33730014cac7 to your computer and use it in GitHub Desktop.
Save rudaoshi/5a620b9f38a38dd5f4de33730014cac7 to your computer and use it in GitHub Desktop.
define a virtual module
import types
class VirtualModule(types.ModuleType):
def __init__(self, module_name, sub_modules):
super().__init__(module_name)
try:
import sys
sys.modules[module_name] = self
self._module_name = module_name
self._sub_modules = sub_modules
for sub_name, module in sub_modules.items():
sys.modules[f"{module_name}.{sub_name}"] = module
except ImportError as err:
raise err # please signal error in some useful way :-)
def __repr__(self):
return "Virtual module for " + self._module_name
def __getattr__(self, attrname):
if attrname in self._sub_modules.keys():
import sys
return self._sub_modules[attrname]
else:
return super().__getattr__(attrname)
# usage
import numpy
VirtualModule("base", {"child": numpy})
import base.child as x
import base
base.child
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment