我的eval语法不正确。也就是说,对于每个类别,我想输出名为category_task的ModelChoiceField,即。如果类别“有趣”,则选择无线电选择字段 将输出'fun_tasks'。
categories = Category.objects.all()
for category in categories:
eval(category)_tasks = form.ModelChoiceField(
queryset = Task.objects.filter(method__category=category),
widget = RadioSelect
)
答案 0 :(得分:4)
“eval是邪恶的。”
好吧,它有它的用途,但是90%的eval使用率(使用任何语言)都是错误的,所以如果你发现自己写了一个eval,你应该停下来检查你正在做什么,并且极度怀疑。
eval(category)_tasks = x
如果你正在做一个赋值,那就是一个语句而不是一个表达式,所以你必须使用exec而不是eval:
exec category+'_tasks= x'
然而,exec和eval一样邪恶!
您可以在Python中编写变量,而无需解析/评估Python代码:
locals()[category+'_tasks']= x
或者,如果你想在当前范围内写一个全局变量而不是一个变量,用localals()替换locals()。
虽然这比eval / exec好,但它仍然比较臭。你很少想要完全动态命名的变量;查找通常更清晰:
catlookup= {}
catlookup[category]= x
虽然没有更多的背景,但很难说出最适合你的情况。