django如何将字符串转换为模块

mar*_*oxe 12 string django variables

我试图理解关于django的另一个神奇之处:它可以将字符串转换为模块.

在settings.py中,INSTALLED_APPS声明如下:

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
)
Run Code Online (Sandbox Code Playgroud)

它包含的只是字符串.但是django会将这些字符串转换为模块并在以后导入它们.

我希望能够做同样的事情.但我不知道怎么做.我在settings.py中有一个渲染器调度程序的字典:

RESOUCE_RENDERER = {
    'video': 'video_player',
    'audio': 'audio_player', 
}
Run Code Online (Sandbox Code Playgroud)

我想以后用这样的:RESOURCE_RENDERER['video'](MyVideo).

我无法直接分配函数名称(例如video_player),因为它存在于需要settings.py的模块中.

sed*_*nym 11

从Django 1.7开始,有一个简单的功能.例如:

from django.utils.module_loading import import_string
my_module = import_string('path.to.my_module')
Run Code Online (Sandbox Code Playgroud)

您还可以从模块中获取课程:

MyClass = import_string('path.to.my_module.MyClass')
Run Code Online (Sandbox Code Playgroud)


小智 8

看看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")
Run Code Online (Sandbox Code Playgroud)

编辑:根据OP的要求,我扩展了示例,并在下面做了一些贡献.

现在,假设您在此模块中有一个函数列表,例如在函数列表中定义的函数列表.然后,你可以像这样打电话给每个人:

ARGUMENTS = '()'

for FUNCTION in FUNCTIONS_TO_CALL:
    function_string = FUNCTION + ARGUMENTS
    exec(function_string)
Run Code Online (Sandbox Code Playgroud)

这假设每个函数都具有相同的已定义参数集.您可以使用if语句来检测用户列出的函数名称,并根据具体情况提供自定义参数.您还可以通过读取python文件来评估参数应该是什么.

你也可以检查模块对象(我认为这是可能的,我不知道),看看是否调用之前存在的功能exec()eval().我不知道,如果可以从函数对象中评估它需要什么参数.我怀疑是这样,但这是一个单独的(可能已经回答?)问题.