Исходный код django.utils.module_loading

import  copy 
import  os 
from  importlib  import  import_module 
from  importlib.util  import  find_spec  as  importlib_find


[документы] Защита import_string ( dotted_path ): «» « Импорт пунктирного путь модуля и возвращает атрибут / класс , обозначенный на .. фамилиях в пути Raise ImportError если импорт не удался » «» попробуйте : module_path , class_name = dotted_path . rsplit ( '.' , 1 ), кроме ValueError как err : raise ImportError ( " % s не похож на путь к модулю" модуль = import_module ( путь_модуля ) попробуйте : обратный GetAttr ( модуль , class_name ) , за исключением AttributeError , как заблуждается : повышение ImportError ( 'Модуль " % s " не определяет " % s " атрибут / класс' % ( module_path , class_name ) ) от ERR
def autodiscover_modules ( * args , ** kwargs ): "" " Автоматическое обнаружение модулей INSTALLED_APPS и тихий сбой, если они отсутствуют. Это заставляет импорт на них регистрировать любые административные биты, которые они могут пожелать. Вы можете предоставить параметр ключевого слова register_to как способ доступа к реестру. Этот объект register_to должен иметь переменную экземпляра _registry для доступа к нему. «» " От django.apps импорта приложений register_to = kwargs . get ( 'register_to' ) для app_config в приложениях . get_app_configs (): для module_to_search в args : # Попытка импортировать модуль приложения. попробуйте : if register_to : before_import_registry = copy . копия ( register_to . _registry ) import_module ( ' % s . % s ' % ( app_config . name , module_to_search )) except Exception : # Сбросить реестр в состояние до последнего импорта # так как этот импорт должен будет повториться при следующем запросе и # это может вызвать NotRegistered и # исключений уже зарегистрировано (см. # 8245). если register_to : register_to . _registry = before_import_registry # Решите, следует ли выдувать эту ошибку. Если в приложении просто # нет рассматриваемого модуля, мы можем игнорировать ошибку # при попытке его импорта, иначе мы хотим, чтобы она всплыла. если module_has_submodule ( app_config . module , module_to_search ): поднять def module_has_submodule ( package , module_name ): "" " Проверить , находится ли 'модуль' в 'пакете'." "" try : package_name = package . __name__ package_path = package . __path__ except AttributeError : # пакет не является пакетом. return False full_module_name = package_name + '' + Module_name попытка : возвращение importlib_find ( full_module_name , package_path ) не является не Никто , кроме ( ModuleNotFoundError , AttributeError ): # Когда module_name является недопустимым пунктирным путем, Python поднимает # ModuleNotFoundError. AttributeError возникает в PY36 (исправлено в PY37) #, если предпоследняя часть пути не является пакетом. return False def module_dir ( module ): "" " Найдите имя каталога, в котором находится модуль, если возможно. В противном случае поднимите ValueError, например, для пакетов пространства имен, которые разделены на несколько каталогов. "" " # Преобразовать в список, потому что _NamespacePath не поддерживает индексацию. Paths = list ( getattr ( module , '__path__' , [])) if len ( paths ) == 1 : return paths [ 0 ] else : filename = getattr ( модуль , '__file__' , Нет ), если имя файла пока не None : возвращение ОС . путь . dirname ( filename ) raise ValueError ( "Невозможно определить каталог, содержащий % s " % модуль )

Copyright ©2020 All rights reserved