0

我的 eval 语法不正确。也就是说,对于每个类别,我想输出一个名为 category_task 的 ModelChoiceField,即。如果类别为“有趣”,则将输出单选字段“有趣任务”。

categories = Category.objects.all()

for category in categories:
    eval(category)_tasks = form.ModelChoiceField(
        queryset         = Task.objects.filter(method__category=category),
        widget           = RadioSelect
    )
4

1 回答 1

4

“评估是邪恶的。”</p>

好的,它有它的用途,但是 90% 的 eval 用法(在任何语言中)都是错误的,所以如果你发现自己在写一个 eval,你应该停下来,带着极大的怀疑检查你在做什么。

eval(category)_tasks = x

如果你正在做一个赋值,那是一个语句而不是一个表达式,所以你必须使用 exec 而不是 eval:

exec category+'_tasks= x'

然而 exec 和 eval 一样邪恶!

您可以在 Python 中编写变量,而无需解析/评估 Python 代码:

locals()[category+'_tasks']= x

或者,如果您想在当前范围内编写一个全局变量而不是一个,请将 locals() 替换为 globals()。

虽然这比 eval/exec 好,但它仍然是相当代码异味。您实际上很少需要完全动态命名的变量;查找通常更干净:

catlookup= {}
catlookup[category]= x

尽管没有更多上下文,但很难说出最适合您的情况。

于 2009-03-18T02:44:51.433 回答