0

私の評価構文は正しくありません。つまり、カテゴリごとに、category_taskという名前のModelChoiceFieldを出力したいと思います。カテゴリが「fun」の場合、ラジオ選択フィールド「fun_tasks」が出力されます。

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

「eval は悪です。」</p>

OK、用途はありますが、(どの言語でも) eval の使用法の 90% は誤解されています。

eval(category)_tasks = x

割り当てを行っている場合、それは式ではなくステートメントであるため、eval ではなく exec を使用する必要があります。

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 に答える