You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
32 lines
1008 B
32 lines
1008 B
2 years ago
|
import os
|
||
|
import sys
|
||
|
from pathlib import Path
|
||
|
|
||
|
|
||
|
class LayeredObject:
|
||
|
def __init__(self, *objects):
|
||
|
self._objects = objects
|
||
|
|
||
|
def __getattr__(self, item):
|
||
|
for o in self.__dict__['_objects']:
|
||
|
try:
|
||
|
if isinstance(o, dict):
|
||
|
return o[item]
|
||
|
elif isinstance(o, os._Environ):
|
||
|
return o[item.upper()]
|
||
|
else:
|
||
|
return getattr(o, item)
|
||
|
except (AttributeError, KeyError):
|
||
|
pass
|
||
|
raise AttributeError(f"None of the objects contained in '{self.__class__.__name__}' have attribute '{item}'.\n"
|
||
|
f"Objects contained: {[repr(o) for o in self.__dict__['_objects']]}")
|
||
|
|
||
|
|
||
|
def import_module(path):
|
||
|
path = Path(path)
|
||
|
assert path.suffix == '.py', f'expected a path to a python module, got {path}'
|
||
|
sys.path.insert(1, str(path.parent))
|
||
|
mod = __import__(path.stem)
|
||
|
sys.path.remove(str(path.parent))
|
||
|
return mod
|