'Dynamic import: How to import * from module name from variable?
As discussed here, we can dynamically import a module using string variable.
import importlib
importlib.import_module('os.path')
My question is how to import *
from string variable?
Some thing like this not working for now
importlib.import_module('os.path.*')
Solution 1:[1]
You can do the following trick:
>>> import importlib
>>> globals().update(importlib.import_module('math').__dict__)
>>> sin
<built-in function sin>
Be warned that makes all names in the module available locally, so it is slightly different than *
because it doesn't start with __all__
so for e.g. it will also override __name__
, __package__
, __loader__
, __doc__
.
Update:
Here is a more precise and safer version as @mata pointed out in comments:
module = importlib.import_module('math')
globals().update(
{n: getattr(module, n) for n in module.__all__} if hasattr(module, '__all__')
else
{k: v for (k, v) in module.__dict__.items() if not k.startswith('_')
})
Special thanks to Nam G VU for helping to make the answer more complete.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 |