2009-03-18 4 views
0

Meine eval Syntax ist nicht richtig. Ich möchte nämlich für jede Kategorie ein ModelChoiceField namens category_task ausgeben, d. Wenn die Kategorie "Spaß" wäre, würde ein Funkauswahlfeld "fun_tasks" ausgegeben werden.Django Python: Eval Syntax für mehrere Felder zur Laufzeit erstellt

categories = Category.objects.all() 

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

Antwort

4

„eval ist böse.“

OK, es seinen Nutzen hat, aber 90% der eval Nutzung (in jeder Sprache) ist misconceived, also, wenn Sie sich einen eval Schreiben finden sollten Sie aufhören und untersuche, was du mit extremem Misstrauen machst.

eval(category)_tasks = x 

Wenn Sie einen Auftrag tun, das ist eine Aussage eher als ein Ausdruck, so dass Sie exec statt eval müss:

exec category+'_tasks= x' 

jedoch exec nur so böse wie eval ist!

Sie eine Variable in Python schreiben kann, ohne zu analysieren, die zu/auswerten Python-Code:

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

oder, wenn Sie eine globale Variable schreiben wollen statt einer im aktuellen Bereich, ersetzen Einheimischen() mit globals().

Obwohl das besser ist als eval/exec, ist es immer noch ziemlich code-stinkig. Sie möchten eigentlich nur vollständig dynamisch benannte Variablen; Ein Lookup ist normalerweise viel sauberer:

obwohl ohne mehr Kontext ist es schwierig zu sagen, was das Beste für Ihren Fall ist.

Verwandte Themen