Question

Je continue à se retrouver dans cette situation où je veux utiliser un dictionnaire très bien comme celui des « locaux » donne en arrière, mais qui ne contient que les variables de la portée limitée de la fonction. Est-il possible de le faire en python?

Un peu plus sur la raison pour laquelle je veux faire ceci: je joue avec Django et quand je vais donner mon contexte de modèles, je suis forcé soit à soit faire manuellement un dictionnaire (en violation des principes DRY) ou passer en locals () qui contient des entrées beaucoup plus sont alors nécessaires (gaspillage). Y at-il peut-être quelque chose que je suis absent avec django qui atténuerait la nécessité d'une solution de niveau python?

Pour clarifier:

Alors, le cas que je l'ai frappé est à plusieurs reprises où j'ai:

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

Ainsi, au lieu de répéter ces variables et les conventions de nommage, je le ferai:

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

Ce que je trouve plus propre, mais je sais que ce genre de bâclée car il y a environ 30 plus d'entrées dans les locaux () alors j'ai réellement besoin.

Était-ce utile?

La solution

Je ne suis pas sûr que je suis d'accord que le fait d'un dictionnaire est une violation de DRY, mais si vous ne voulez vraiment pas répéter quoi que ce soit, vous pouvez simplement définir un dictionnaire « contexte » en haut de la vue et utiliser les clés de dictionnaire au lieu de certaines variables dans la vue.

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

Autres conseils

Comment se passe un dictionnaire une violation de DRY? Django est tout au sujet DRY , donc je doute que le comportement standard de cela violerait directement elle. Dans les deux cas, cependant, j'utilise une version modifiée de django-ennuyeux faire toute chose plus facile:

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

Le décorateur prend en charge render_to le contexte de demande et toutes ces bonnes choses. Fonctionne bien.

Si cela ne fonctionne pas, je vous suggère de reformuler votre question. Quoi que vous voulez faire déconner avec et tel est locals() rarement nécessaire surtout dans ce genre de situation avec Django.

Vous dites que vous n'aimez pas utiliser locals () parce qu'il est « inutile ». Gaspilleur de quoi? Je crois que le dictionnaire retourne existe déjà, il est juste de vous donner une référence. Et même si elle doit créer le dictionnaire, c'est l'une des opérations les plus hautement optimisées en Python, donc ne vous inquiétez pas.

Vous devez vous concentrer sur la structure du code qui exprime le mieux votre intention, avec le plus petit nombre de possibilités d'erreur. Les déchets que vous êtes inquiet au sujet est rien à craindre.

Alors que je suis d'accord avec beaucoup d'autres répondants que le passage soit ou un dict locals() entièrement spécifié est OK plus {'var1':var1, 'var2': var2} probablement, si vous voulez spécifiquement « sous-ensemble » un dict, comme qui est loin <=> du disque soit, par exemple:

loc = locals()
return dict((k,loc[k]) for k in 'var1 var2'.split())
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top