在python中有与php的$$变量类似的语法

时间:2009-08-20 23:20:41

标签: python django

在python中有与php的$$变量类似的语法吗?我实际上尝试的是基于值加载模型。

例如,如果值为Song,我想导入Song模块。 我知道我可以使用if语句或lambada,但类似于php的$$变量将会非常方便。

我所追求的是类似的东西。

from mypackage.models import [*variable] 

然后在视图中

def xyz(request): 
    xz = [*variable].objects.all() 

*变量是在设置中定义的值,或者可以来自comandline。它可以是项目中的任何模型。

4 个答案:

答案 0 :(得分:3)

def load_module_attr (path):
    modname, attr = path.rsplit ('.', 1)
    mod = __import__ (modname, {}, {}, [attr])
    return getattr (mod, attr)

def my_view (request):
    model_name = "myapp.models.Song" # Get from command line, user, wherever
    model = load_module_attr (model_name)
    print model.objects.all()

答案 1 :(得分:1)

我很确定你想要__import__()

阅读本文:docs.python.org: __import__

  

import函数调用此函数。它可以被替换(通过导入builtins模块并分配给builtins.__import__)以更改import语句的语义,但是现在使用导入钩子通常更简单(参见PEP 302)。直接使用__import__()的情况很少见,除非您要导入名称仅在运行时已知的模块。

答案 2 :(得分:1)

您似乎想要加载所有可能匹配的模块/模型,并根据请求选择要使用的特定模块/模型。你可以“globals()”返回全局级变量的字典,可以通过字符串索引。所以如果你做一些像globals()['Song']的东西,它会给你一个Song模型。这很像PHP的$$,除了它只会抓取全局范围的变量。对于本地范围,您必须调用locals()。

这是一些示例代码。

from models import Song, Lyrics, Composers, BlaBla

def xyz(request):
    try:
        modelname = get_model_name_somehow(request):
        model =globals()[modelname]
        model.objects.all()
    except KeyError:
        pass # Model/Module not loaded ... handle it the way you want to 

答案 3 :(得分:0)

所以你知道一般概念,你想要实现的是“反射编程”。

您可以在维基百科条目中查看多种语言的示例

http://en.wikipedia.org/wiki/Reflective_programming