Python中是否有类似PHP的$$variable语法?
在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()
当然可以!请把你想要翻译的内容发给我,我会帮你把它变得更简单易懂。