Conversation
|
This branch contains a initial code to format from foo import bar
from foo import baz
from foo.bar import (func1, func2,)
__all__ = ['bar', 'baz', 'func1', 'func2']Looks like: def lazy_install(module_name, submodules, submod_attrs):
import sys
import importlib
import importlib.util
all_funcs = []
for mod, funcs in submod_attrs.items():
all_funcs.extend(funcs)
name_to_submod = {
func: mod for mod, funcs in submod_attrs.items()
for func in funcs
}
def require(fullname):
if fullname in sys.modules:
return sys.modules[fullname]
spec = importlib.util.find_spec(fullname)
try:
module = importlib.util.module_from_spec(spec)
except:
raise ImportError(f'Could not lazy import module {fullname}') from None
loader = importlib.util.LazyLoader(spec.loader)
sys.modules[fullname] = module
# Make module with proper locking and get it inserted into sys.modules.
loader.exec_module(module)
return module
def __getattr__(name):
if name in submodules:
fullname = f'{module_name}.{name}'
attr = require(fullname)
elif name name_to_submod:
modname = name_to_submod[name]
attr = importlib.import_module(
f'{module_name}.{modname}'
)
else:
raise AttributeError(f'No {module_name} attribute {name}')
# Set module-level attribute so getattr is not called again
globals()[name] = attr
return attr
return __getattr__
__getattr__ = lazy_install(
__name__,
submodules={
'bar',
'baz',
},
submod_attrs={
'bar': [
'func1',
'func2',
],
},
)
def __dir__():
return __all__
__all__ = ['bar', 'baz', 'func1', 'func2']I'm not 100% sure what the best way to handle this overhead is. Its also possible the formatting of the lazy install call could be slightly more compact. Some of this could be mitigate with a TPL import, in which case we could get something more like this: from importlib import lazy_install
__getattr__ = lazy_install(
__name__,
submodules={'bar', 'baz'},
submod_attrs={
'bar': ['func1', 'func2',],
},
) |
Codecov Report
@@ Coverage Diff @@
## master #10 +/- ##
==========================================
+ Coverage 82.09% 82.45% +0.35%
==========================================
Files 7 8 +1
Lines 754 832 +78
Branches 170 189 +19
==========================================
+ Hits 619 686 +67
- Misses 95 102 +7
- Partials 40 44 +4
Continue to review full report at Codecov.
|
wip wip wip
wip wip Fix python2 issue Add codecov.yml wip wip work on CircleCI wip wip wip wip wip wip wip wip wip wip wip wip wip wip
Work to support networkx/networkx#4349