Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Import * from module by importing via string

Tags:

python

I know I can use importlib to import modules via a string. How can I recreate the import * functionality using this library? Basically, I want something like this:

importlib.import_module('path.to.module', '*')

My reasons for not name-spacing the imported attributes are deliberate.

like image 472
Michael Avatar asked Dec 14 '22 13:12

Michael


2 Answers

Here is a solution: import the module, then one by one make alias in the current namespace:

import importlib

# Import the module
mod = importlib.import_module('collections')

# Determine a list of names to copy to the current name space
names = getattr(mod, '__all__', [n for n in dir(mod) if not n.startswith('_')])

# Copy those names into the current name space
g = globals()
for name in names:
    g[name] = getattr(mod, name)
like image 118
Hai Vu Avatar answered Dec 29 '22 00:12

Hai Vu


Here is shorten version for @HaiVu answer which refers to this solution from @Bakuriu

import importlib

# import the module
mod = importlib.import_module('collections')

# make the variable global
globals().update(mod.__dict__)

Note:

  • This will import lots of things beside the user-defined variables

  • @HaiVu solution did the best of it ie. only import user-defined variables

like image 22
Nam G VU Avatar answered Dec 29 '22 01:12

Nam G VU