Frage

Ich halte endet an dieser Situation, wo ich wie die ‚Einheimischen‘ sehr viel ein Wörterbuch verwenden möchten gibt zurück, aber das sind nur die Variablen im begrenzten Bereich der Funktion. Gibt es eine Möglichkeit, dies in Python zu tun?

Ein bisschen mehr darüber, warum ich dies tun will: Ich mit Django bin zu spielen und wenn ich gehe zu meinen Vorlagen Kontext zu geben, ich bin entweder gezwungen, entweder manuell ein Wörterbuch machen (In Verletzung mit DRY Prinzipien) oder Pass in Einheimische (), die weit mehr Einträge enthält dann benötigt (verschwenderisch). Gibt es vielleicht etwas, das ich mit django bin fehlt, die die Notwendigkeit einer Python-Ebene Lösung lindern würde?

Zur Klarstellung:

So ist der Fall, dass ich immer wieder getroffen habe, ist, wo ich:

@render_to('my_template.html') 
def myview(request): 
    var1 = #blahblah 
    var2 = #... 
    # do stuff with vars 
    return {'var1': val1,'var2':val2} 

Also anstatt diese Variablen und Namenskonventionen zu wiederholen, werde ich tun:

@render_to('my_template.html') 
def myview(request): 
    var1 = #blahblah 
    var2 = #... 
    # do stuff with vars 
    return locals() 

Was ich finden sauberer, aber ich weiß, seine Art von schlampig, da es etwa 30 weitere Einträge in Einheimischen () dann brauche ich eigentlich.

War es hilfreich?

Lösung

Ich bin mir nicht sicher, ob ich damit einverstanden, dass ein Wörterbuch zu machen, ist eine Verletzung von DRY, aber wenn Sie wirklich nicht wollen, überhaupt etwas zu wiederholen, Sie könnten nur einen ‚Kontext‘ Wörterbuch an der Spitze der Ansicht definieren und verwenden Dictionary-Schlüssel anstelle von Variablen in der gesamten Ansicht.

def my_view(request):
    context = {}
    context['items'] = Item.objects.all()
    context['anothervalue'] = context['items'][2].name
    return render_to_response('template.html', context)

Andere Tipps

Wie vergeht ein Wörterbuch eine Verletzung des DRY? Django ist alles über DRY , so bezweifle ich, das Standardverhalten von direkt sie verletzen würde. In beiden Fällen verwende ich jedoch eine modifizierte Version von django-ärgerlich macht die ganze Sache einfacher:

@render_to('my_template.html')
def myview(request):
    # figure stuff out...
    return {'var1':'val1','var2','val2'}

Der render_to Dekorateur kümmert mich um den Anforderungskontext und all die guten Sachen. Funktioniert gut.

Wenn das nicht hilft, schlage ich vor Umformulierung Ihre Frage. Was immer Sie wollen mit locals() Herumspielen zu tun, und so ist selten notwendig, vor allem in einer solchen Situation mit Django.

Sie sagen Sie nicht wie Einheimische mit (), weil es „verschwenderisch“ ist. Verschwenderisch von was? Ich glaube, das Wörterbuch es existiert bereits gibt, ist es einfach geben einen Hinweis auf sie. Und selbst wenn es das Wörterbuch erstellen hat, ist dies eine der hoch optimierten Operationen in Python, also nicht darüber keine Sorge.

Sie sollten auf der Codestruktur konzentrieren, die am besten Ihre Absicht zum Ausdruck bringt, mit den wenigstenen Möglichkeiten für Fehler. Der Abfall Sie sich Sorgen um nichts zu befürchten.

Während ich mit vielen anderen Befragten einig, dass entweder locals() oder eine vollständig spezifizierte dict {'var1':var1, 'var2': var2} vorbei ist höchstwahrscheinlich auf OK, wenn Sie speziell ein dict wie locals() auf „Teilmenge“ wollen, die entweder weit von schwer, z.

loc = locals()
return dict((k,loc[k]) for k in 'var1 var2'.split())
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top