Как django конвертирует строку в модули - PullRequest
12 голосов
/ 09 сентября 2010

Я пытаюсь понять другую волшебную вещь о django: он может конвертировать строки в модули.

В settings.py, INSTALLED_APPS объявляется так:

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
)

Все этосодержит строкиНо django преобразует эти строки в модули и импортирует их позже.

Я хочу сделать то же самое.но я не знаю как.У меня есть словарь диспетчера рендерера в settings.py:

RESOUCE_RENDERER = {
    'video': 'video_player',
    'audio': 'audio_player', 
}

Я хочу использовать его позже, как это: RESOURCE_RENDERER['video'](MyVideo).

Я не могу назначить непосредственно имя функции (например, video_player) потому что он живет в модуле, который нуждается в settings.py.

Ответы [ 2 ]

10 голосов
/ 10 ноября 2015

Поскольку в Django 1.7 есть простая функция для этого .Например:

from django.utils.module_loading import import_string
my_module = import_string('path.to.my_module')

Вы также можете получить классы из модуля:

MyClass = import_string('path.to.my_module.MyClass')
8 голосов
/ 09 сентября 2010

Взгляните на django.conf.__init__.py, но в основном он использует importlib примерно так:

try:
    mod = importlib.import_module(self.SETTINGS_MODULE)
except ImportError, e:
    raise ImportError("Could not import settings '%s' 
               (Is it on sys.path? Does it have syntax errors?):
                %s" % (self.SETTINGS_MODULE, e))

# Settings that should be converted into tuples if they're mistakenly entered
# as strings.
tuple_settings = ("INSTALLED_APPS", "TEMPLATE_DIRS")

Редактировать : По просьбе ОП я расширил пример и добавил еще немного ниже.

Теперь, предположим, у вас есть список функций в этом модуле, определенный, например, в списке функций FUNCTIONS TO CALL. Затем вы можете назвать каждого из них так:

ARGUMENTS = '()'

for FUNCTION in FUNCTIONS_TO_CALL:
    function_string = FUNCTION + ARGUMENTS
    exec(function_string)

Это предполагает, что каждая функция имеет одинаковый набор определенных аргументов. Вы можете использовать оператор if для определения имени функции, указанного пользователем, и предоставления пользовательских аргументов в зависимости от того, что это такое. Вы также можете оценить, прочитав файл python, какими должны быть аргументы.

Вы также можете проверить объект модуля, чтобы (я предполагаю, что это возможно, я не знаю) увидеть, существует ли эта функция перед вызовом exec() или eval(). Опять же, я не знаю, можно ли из объекта функции оценить, какие аргументы он принимает. Я подозреваю, что это так, но это отдельный (возможно, уже ответил?) Вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...