Как я могу динамически импортировать функцию модуля python?

Предполагая, что my_function () находится в my_apps.views, я бы хотел импортировать my_function динамически, не используя что-то вроде exec или eval ].

Есть ли способ сделать это? Я собираюсь сделать что-то похожее на:

my_function = import_func("my_apps.views.my_function")

my_function()
   ... code is executed
18
задан Anshuman Dikhit 24 April 2019 в 23:40
поделиться

2 ответа

вы хотите

my_function = getattr(__import__('my_apps.views'), 'my_function')

Если вы знаете имя функции во время компиляции, вы можете сократить его до

my_function = __import__('my_apps.views').my_function

Это загрузит my_apps.views и затем назначьте его атрибут my_function локальному атрибуту my_function.

Если вы уверены, что вам нужна только одна функция, это допустимо. Если вам нужно более одного атрибута, вы можете сделать:

views = __import__('my_apps.views')
my_function = getattr(views, 'my_function')
my_other_function = getattr(views, 'my_other_function')
my_attribute = getattr(views, 'my_attribute')

, поскольку это более читабельно и избавляет вас от некоторых вызовов __import__. опять же, если вы знаете имена, код можно сократить, как указано выше.

Вы также можете сделать это с помощью инструментов из модуля imp, но это сложнее.

26
ответ дан 30 November 2019 в 07:28
поделиться

Обратите внимание, что Python 2.7 добавил модуль importlib, удобные оболочки для __import__() и бэкпорт функции 3.1.

Этот модуль является небольшим подмножеством того, что доступно в более полнофункциональном одноименном пакете из Python 3.1, который обеспечивает полную реализацию импорта. То, что здесь есть, было предоставлено, чтобы облегчить переход с 2.7 на 3.1.

importlib.import_module(name, package=None)

Импорт модуля. Аргумент имени указывает, какой модуль импортировать в абсолютном или относительном выражении (например, pkg.mod или ..mod). Если имя указано в относительных терминах, то аргумент пакета должен быть указан для пакета, который должен действовать как якорь для разрешения имени пакета (например, import_module('..mod', 'pkg.subpkg') будет импортировать pkg .мод). Указанный модуль будет вставлен в sys.modules и возвращен.

9
ответ дан 30 November 2019 в 07:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: