Skip to content

Instantly share code, notes, and snippets.

@JelleZijlstra
Last active September 30, 2024 06:45
Show Gist options
  • Save JelleZijlstra/23c01ceb35d1bc8f335128f59a32db4c to your computer and use it in GitHub Desktop.
Save JelleZijlstra/23c01ceb35d1bc8f335128f59a32db4c to your computer and use it in GitHub Desktop.
import builtins
from contextlib import contextmanager
real_import = builtins.__import__
is_lazy = False
@contextmanager
def lazy():
global is_lazy
is_lazy = True
try:
yield
finally:
is_lazy = False
def _resolve(proxy):
obj = real_import(*proxy.args)
proxy.args[1][proxy.args[0]] = obj
return obj
class Proxy:
def __init__(self, args):
self.args = args
def __getattr__(self, attr):
return getattr(_resolve(self), attr)
def __call__(self, *args, **kwargs):
return _resolve(self)(*args, **kwargs)
class SpecialKey:
def __init__(self, key, proxy) -> None:
self.key = key
self.proxy = proxy
self.counter = 0
def __eq__(self, value: object) -> bool:
if not isinstance(value, str):
return NotImplemented
if value != self.key:
return False
self.counter += 1
if self.counter == 2:
_resolve(self.proxy)
return True
def __hash__(self) -> int:
return hash(self.key)
def new_import(name, globals, locals, fromlist, level):
if is_lazy:
proxy = Proxy((name, globals, locals, fromlist, level))
globals[SpecialKey(name, proxy)] = proxy
return proxy
else:
return real_import(name, globals, locals, fromlist, level)
builtins.__import__ = new_import
from lazy import lazy
with lazy():
import os
print(os) # <module 'os' (frozen)>
print(os.path) # <module 'posixpath' (frozen)>
print(os) # <module 'os' (frozen)>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment