Предполагая, что my_function ()
находится в my_apps.views, я бы хотел импортировать my_function
динамически, не используя что-то вроде exec
или eval
].
Есть ли способ сделать это? Я собираюсь сделать что-то похожее на:
my_function = import_func("my_apps.views.my_function")
my_function()
... code is executed
вы хотите
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, но это сложнее.
Обратите внимание, что 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 и возвращен.