Динамический импорт Python - как импортировать * из имени модуля из переменной?

Как обсуждалось здесь, мы можем динамически импортировать модуль с помощью строковой переменной.

import importlib
importlib.import_module('os.path')

Мой вопрос в том, как import * из строковой переменной?

Некоторая вещь вроде этого сейчас не работает

importlib.import_module('os.path.*')

Ответ 1

Вы можете сделать следующий трюк:

>>> import importlib
>>> globals().update(importlib.import_module('math').__dict__) 
>>> sin
<built-in function sin>

Предупредить, что все имена в модуле доступны локально, поэтому он немного отличается от *, потому что он не начинается с __all__, так, например, для. он также переопределит __name__, __package__, __loader__, __doc__.

Update:

Вот более точная и безопасная версия, которую @mata указала в комментариях:

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('_')
})

Особая благодарность Nam G VU за помощь, чтобы сделать ответ более полным.