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().我不知道,如果可以从函数对象中评估它需要什么参数.我怀疑是这样,但这是一个单独的(可能已经回答?)问题.
| 归档时间: |
|
| 查看次数: |
2624 次 |
| 最近记录: |