¿Por qué los marcos de Python devuelven diccionarios de los controladores?
-
10-07-2019 - |
Pregunta
¿Por qué (por ejemplo, web2py) devuelve datos de un controlador en un diccionario en lugar de variables (vea Rails)?
Por ejemplo:
return dict(sape=4139, guido=4127, jack=4098)
en lugar de (así es como lo hace Rails)
@var1 = "jello"
@var2 = "hihi"
¿Existe alguna ventaja al usar diccionarios sobre las variables simples (speed-wise / code-wise)?
Actualización: la forma anterior es en realidad una forma correcta de crear un diccionario (al menos en Python 2.6.1). La otra forma (que mucha gente dice que es la correcta)
return {"var1": "jello", "var2": "hihi"}
no se usa mucho en los marcos de Python.
De Documentación de Python : " Cuando las claves son cadenas simples, a veces es más fácil especificar pares usando argumentos de palabras clave: "
dict(sape=4139, guido=4127, jack=4098)
Solución
La principal ventaja es que esta es la única forma en que Python devuelve a) más de un solo valor y b) le da un nombre a ese valor. Otras opciones serían usar una clase (código adicional), devolver una tupla (sin nombres, por lo que tendría que usar índices para acceder a los valores) o permitir devolver solo un valor único, lo que probablemente significaría que todos devolverían un diccionario ya que esa es la solución más simple.
También permite ajustar varios métodos y unir / fusionar sus resultados. Por último, permite devolver fácilmente diferentes conjuntos de pares de valor / nombre para cada llamada, por ejemplo, omitir valores opcionales o devolver sugerencias adicionales.
Otros consejos
Puede usar variables locales si desea:
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>
En web2py, una solicitud HTTP para " / app / c / f " se asigna a una llamada a la función f () en el archivo (controlador) c.py en la aplicación " app " ;. los El archivo c.py está escrito en Python. los La salida de la función f () puede ser un cadena (en este caso se devuelve), o un conjunto de variables (implementado como un diccionario de python) En lo ultimo caso las variables se representan en HTML por un archivo c / f.html, llamado ver.
Lo bueno es que un motor de plantillas como Jinja2 trata un objeto y un dict de manera similar, así que si:
d = {'color': 'red'}
o = Color(red)
entonces todos estos funcionan en la sintaxis de la plantilla:
d.color d['color'] o.color o['color']