Perché i framework di Python restituiscono dizionari dai controller?
-
10-07-2019 - |
Domanda
Perché (ad esempio web2py) restituisci dati da un controller in un dizionario anziché variabili (vedi Rails)?
Ad esempio:
return dict(sape=4139, guido=4127, jack=4098)
invece di (è così che fa Rails)
@var1 = "jello"
@var2 = "hihi"
C'è qualche vantaggio nell'usare i dizionari rispetto alle variabili semplici (in termini di velocità / in termini di codice)?
Aggiornamento: il modo sopra è in realtà un modo corretto per creare un dizionario (almeno in Python 2.6.1). L'altro modo (che molte persone dicono sia quello corretto)
return {"var1": "jello", "var2": "hihi"}
non è molto usato dai framework Python.
Da la documentazione di Python : " Quando le chiavi sono stringhe semplici, a volte è più facile specificare le coppie usando argomenti di parole chiave: "
dict(sape=4139, guido=4127, jack=4098)
Soluzione
Il vantaggio principale è che questo è l'unico modo in Python per restituire a) più di un singolo valore e b) dare a quel valore un nome. Altre opzioni sarebbero usare una classe (codice extra), restituire una tupla (senza nomi, quindi dovresti usare gli indici per accedere ai valori) o consentire di restituire un solo valore che probabilmente significherebbe che tutti restituirebbero un dizionario poiché è la soluzione più semplice.
Permette anche di racchiudere diversi metodi e unire / unire i loro risultati. Infine, consente di restituire facilmente diversi insiemi di coppie valore / nome per ogni chiamata, ad esempio omettere valori opzionali o restituire suggerimenti aggiuntivi.
Altri suggerimenti
Puoi utilizzare le variabili locali se desideri:
def hello():
var1 = "whatever you like"
var2 = "another value"
return locals() # or vars()
hello.html
:
<html><body>
<p>var1 {{=var1}}</p>
<p>var2 {{=var2}}</p>
</body></html>
In web2py una richiesta HTTP per & Quot; / app / c / f " viene mappato in una chiamata a la funzione f () nel file (controller) c.py nell'applicazione "app". Il il file c.py è scritto in Python. Il l'output della funzione f () può essere a stringa (in questo caso viene restituita), o un insieme di variabili (implementato come un dizionario Python). In quest'ultimo nel caso in cui le variabili siano rese HTML da un file c / f.html, chiamato a view.
La cosa bella è che un template engine come Jinja2 tratta un oggetto e un dict in modo simile, quindi se:
d = {'color': 'red'}
o = Color(red)
quindi funzionano tutti nella sintassi del modello:
d.color d['color'] o.color o['color']