Python中是否有类似PHP的$$variable语法?

2 投票
4 回答
537 浏览
提问于 2025-04-15 13:46

在Python中有没有类似于PHP的$$变量的语法?我其实是想根据一个值来加载一个模型。

比如说,如果这个值是Song,我就想导入Song模块。我知道可以用if语句或者lambda表达式,但如果有类似于PHP的$$变量的方式会方便很多。

我想要的东西大概是这样的。

from mypackage.models import [*variable] 

然后在视图中

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

*variable是一个在设置中定义的值,或者可以来自命令行。它可以是项目中的任何模型。

4 个回答

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 
1

我想你可能需要用到 __import__() 这个东西。

你可以看看这个链接了解更多信息: docs.python.org: __import__

这个函数是通过 import 语句来调用的。你可以通过导入内置模块并把它赋值给 builtins.__import__ 来替换它,这样就能改变 import 语句的行为。不过现在通常用 import hooks 更简单(可以参考 PEP 302)。直接使用 __import__() 的情况比较少,除非你想导入一个在运行时才知道名字的模块。

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()

当然可以!请把你想要翻译的内容发给我,我会帮你把它变得更简单易懂。

撰写回答