【问题标题】:Django Python: Eval syntax for multiple fields created at runtimeDjango Python:运行时创建的多个字段的 Eval 语法
【发布时间】:2009-03-18 01:32:34
【问题描述】:

我的 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
    )

【问题讨论】:

    标签: django-forms


    【解决方案1】:

    “评估是邪恶的。”

    好的,它有它的用途,但是 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
    

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

    【讨论】:

      猜你喜欢
      • 2011-01-20
      • 1970-01-01
      • 1970-01-01
      • 2020-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-04
      相关资源
      最近更新 更多