Domanda

Continuo a finire in questa situazione in cui voglio usare un dizionario molto simile a quella 'locali' dà indietro, ma che contiene solo le variabili nella portata limitata della funzione. C'è un modo per fare questo in Python?

Un po 'di più su questo che voglio fare questo: sto giocando con Django e quando vado a dare il mio contesto modelli, sono costretto sia dare sia manualmente un dizionario (In violazione dei principi secca) o passare a locals (), che contiene molte più voci, allora sono necessari (spreco). C'è forse qualcosa che mi manca con Django che alleviare la necessità di una soluzione di livello Python?

Per chiarire:

Quindi, il caso che ho colpito più volte è dove ho:

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

Così, invece di ripetere tali variabili e convenzioni di denominazione, lo farò:

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

Il che sembra più pulito, ma so che questo tipo di sciatta dato che ci sono circa 30 di più voci nel locals (), poi ho effettivamente bisogno.

È stato utile?

Soluzione

Non sono sicuro Sono d'accordo che facendo un dizionario è una violazione di asciutto, ma se davvero non si vuole ripetere nulla, si può solo definire un dizionario 'contesto' nella parte superiore della vista e utilizzare i tasti del dizionario, invece di variabili per tutta la vista.

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

Altri suggerimenti

Come sta passando un dizionario una violazione della SECCO? Django è tutto SECCO , quindi dubito il comportamento standard di esso sarebbe direttamente violarla. In entrambi i casi, però, io uso una versione modificata di django-fastidioso per rendere il tutto più facile:

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

Il decoratore render_to si prende cura del contesto di richiesta e tutta quella roba buona. Funziona bene.

Se questo non aiuta, vi suggerisco di riformulare la domanda. Qualunque cosa si vuole fare fare in giro con locals() e tale è raramente necessaria soprattutto in questo tipo di situazione con Django.

Tu dici che non ti piace con la gente del posto () perché è "uno spreco". Uno spreco di che cosa? Credo che il dizionario restituisce esiste già, è solo dando un riferimento ad esso. E anche se deve creare il dizionario, questa è una delle operazioni più altamente ottimizzato in Python, quindi non ti preoccupare.

Si dovrebbe concentrarsi sulla struttura del codice che esprime al meglio la vostra intenzione, con il minor numero di possibilità di errore. I rifiuti si sono preoccupati è nulla di cui preoccuparsi.

Mentre sono d'accordo con molti altri intervistati che passa sia locals() o un dict completamente specificato {'var1':var1, 'var2': var2} è più probabile OK, se si vuole specificamente a "sottoinsieme" un dict, come <=> che è tutt'altro che difficile sia, ad esempio:

loc = locals()
return dict((k,loc[k]) for k in 'var1 var2'.split())
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top