Pregunta

Sigo terminando en esta situación en la que quiero usar un diccionario muy parecido al que devuelven los 'locales', pero que solo contiene las variables en el alcance limitado de la función.¿Hay alguna manera de hacer esto en Python?

Un poco más sobre por qué quiero hacer esto:Estoy jugando con Django y cuando voy a darle contexto a mis plantillas, me veo obligado a crear manualmente un diccionario (en violación de los principios DRY) o pasar locales() que contiene muchas más entradas de las necesarias (un desperdicio) .¿Quizás me falta algo con Django que aliviaría la necesidad de una solución a nivel de Python?

Para aclarar:

Entonces, el caso que he encontrado repetidamente es donde tengo:

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

Entonces, en lugar de repetir esas variables y convenciones de nomenclatura, haré:

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

Lo cual me parece más limpio, pero sé que es un poco descuidado ya que hay alrededor de 30 entradas más en locals() de las que realmente necesito.

¿Fue útil?

Solución

No estoy seguro estoy de acuerdo que hacer un diccionario es una violación de la SECO, pero si realmente no quiere repetir nada en absoluto, sólo podría definir un diccionario 'contexto' en la parte superior de la vista y utilizar claves de diccionario en lugar de las variables a lo largo de 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)

Otros consejos

¿Cómo es que pasar un diccionario es una violación de DRY? Django tiene que ver con SECO, por lo que dudo que su comportamiento estándar lo viole directamente.En cualquier caso, sin embargo, uso una versión modificada de Django-molesto para hacer todo más fácil:

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

El render_to decorador se encarga del contexto de la solicitud y todas esas cosas buenas.Funciona bien.

Si esto no ayuda, le sugiero reformular su pregunta.Lo que sea que quieras hacer jugando con locals() y esto rara vez es necesario, especialmente en este tipo de situación con Django.

Usted dice que no le gusta el uso de los locales () porque es "derrochador". Desperdicio de qué? Creo que el diccionario que ya vuelve existe, es sólo que le da una referencia a él. E incluso si tiene que crear el diccionario, esta es una de las operaciones más altamente optimizado en Python, por lo que no se preocupe por ello.

Usted debe centrarse en la estructura del código que mejor expresa su intención, con el menor número de las posibilidades de error. Los residuos le preocupa es nada de qué preocuparse.

Aunque estoy de acuerdo con muchos otros encuestados que pasar ya sea locals() o un diccionario completamente especificado {'var1':var1, 'var2': var2} es más probable bien, si desea específicamente a "subgrupo" un diccionario como <=> que está lejos de ser difícil tampoco, por ejemplo:

loc = locals()
return dict((k,loc[k]) for k in 'var1 var2'.split())
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top