- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
def load_module(name, attrs=[], level = -1):
"""
Динамически загружает модуль с указанным именем и его атрибуты.
:param name: Имя модуля. Например: "catalog", "my.orders".
:param attrs: Список атрибутов, которые необходимо загрузить.
:param level: Указывает количество родительских дирректорий, в которых будет выполнен поиск модуля.
:exception ImportError: При ошибке импорта модуля, например, когда не удалось найти указанный модуль.
:return module: Модуль с атрибутами.
"""
# Загружаем модуль. __import__ аналогичен вызову import или from xxx import yyy только представлен в виде обычной функции
module = __import__(name, globals(), locals(), attrs, level)
# Если при загрузке модуля не были указаны атрибуты модуля, то загрузился корневой модуль.
if not attrs:
# Если в имени модуля присутствовали подмодули, то спускаемся по ним до искомого модуля.
path_list = name.split('.')[1:]
if path_list:
# сильно замедренно, но какя понял вызываем модуль catalog.views если мы изначально загружаем catalog.views.product - т.е. товар
# getattr(x, y) = x.y, поэтому getattr(catalog.views, product) = catalog.views.product
module = reduce(lambda x, y: getattr(x, y), path_list, module)
return module