2010-11-01 4 views
5

à l'aide de la population locale() Le code suivant ne fonctionne pas, je suppose que la population locale() variable dans la compréhension se référera au bloc imbriqué où la compréhension est évaluée:intérieur compréhension du dictionnaire

def f(): 
    a = 1 
    b = 2 
    list_ = ['a', 'b'] 
    dict_ = {x : locals()[x] for x in list_} 

Je pourrais utiliser globals() à la place, et cela semble fonctionner, mais cela peut venir avec quelques problèmes supplémentaires (par exemple, s'il y avait une variable d'une portée environnante qui arrive à avoir le même nom).

Y at-il quelque chose qui rendrait le dictionnaire en utilisant les variables précisément dans le cadre de la fonction f?

Note: Je le fais parce que j'ai beaucoup de variables que je voudrais mettre dans un dictionnaire plus tard, mais je ne veux pas compliquer le code en écrivant dict_['a'] au lieu de a pendant ce temps.

Répondre

4

Vous pourriez peut-être faire:

def f(): 
    a = 1 
    b = 2 
    list_ = ['a', 'b'] 
    locals_ = locals() 
    dict_ = dict((x, locals_[x]) for x in list_) 

Cependant, je déconseillons fortement l'utilisation de locals() à cet effet.

+0

Je ne pensais pas à ça! Et pourquoi est-ce mauvais d'utiliser les locaux() comme ça? Je n'utilise rien de sans-papiers, n'est-ce pas? – max

+2

Ce n'est pas non documenté, mais l'utilisation de 'locals()' peut amener le compilateur à générer du code moins qu'optimal pour la fonction où il est référencé. Par exemple, si le compilateur détermine qu'il peut optimiser l'utilisation de certaines variables temporaires (peut-être une autre * variable * dans la fonction sans rapport avec votre dictionnaire), il pourrait ne pas être capable de le faire si '' '' '' '' '' '' '' ' dans la fonction. Aussi, en évitant de créer un dictionnaire d'abord, vous vous répétez avec (1) l'attribution de chaque variable, et (2) les noms dans la liste. –

+0

Ensuite, je suis coincé: http://stackoverflow.com/questions/4067463/alternative-to-locals-in-printing-a-table-with-a-header – max

1

Je crois que vous avez raison: le locals() à l'intérieur de la compréhension dictée se référera à l'espace de noms de la compréhension.

Une solution possible (si elle n'a pas déjà eu lieu vous):

f_locals = locals() 
dict_ = {x : f_locals[x] for x in list_}