-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbase.py
More file actions
92 lines (69 loc) · 2.25 KB
/
base.py
File metadata and controls
92 lines (69 loc) · 2.25 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
import builtins
import importlib
import sys
# __globals__ = __builtins__.globals
# __globals__ = globals()
# class Base:
# # TODO: extend ModuleType?
# def __init__(self, vars):
# self._vars = vars
# def __getattr__(self, name):
# try:
# return self._vars[name]
# except KeyError:
# print(f"*** missing {name}")
# try:
# module = importlib.import_module(name)
# except ImportError:
# print(f"*** failed to import {name}")
# raise AttributeError(name)
# else:
# print(f"*** successfully imported {name}")
# self._vars[name] = module
# print(f"*** returning {name}")
# return module
# # base = Base(globals())
# sys.modules[__name__] = Base(vars(builtins))
def get_or_import(dct, name):
print(f"*** getting {name}")
try:
return dct[name]
except KeyError:
print(f"*** missing {name}")
try:
module = importlib.import_module(name)
except ImportError:
print(f"*** failed to import {name}")
raise AttributeError(name)
else:
print(f"*** successfully imported {name}")
dct[name] = module
print(f"*** returning {name}")
return module
class ImportDict(dict):
"""yolo"""
def __missing__(self, name):
print(f"*** missing {name}")
try:
module = importlib.import_module(name)
except ImportError:
print(f"*** failed to import {name}")
raise KeyError(name)
print(f"*** successfully imported {name}")
self[name] = module
print(f"*** returning {name}")
return module
# TODO: implement Base via a metaclass/type using an ImportDict
class Base:
def __init__(self, dct):
self.__dict = ImportDict(dct)
def __getattr__(self, name):
return self.__dict[name]
# base = Base(ImportDict(vars(builtins)))
sys.modules['builtins'] = Base(vars(builtins))
# class Base:
# def __init__(self, dct):
# self.__dict__ = dct
# def __getattr__(self, name):
# return get_or_import(self.__dict__, name)
# base = Base(globals())