Étant donné une liste de noms de variables en Python, comment puis-je créer un dictionnaire avec les noms de variables comme les touches (pour les valeurs des variables)?

J'ai une liste de noms de variable, comme ceci:

['foo', 'bar', 'baz']

(Je l'ai d'abord demandé comment je la conversion d'une liste de variables. Voir Greg Hewgill la réponse ci-dessous.)

Comment puis-je convertir ce pour un dictionnaire dont les clés sont les noms des variables (comme des chaînes de caractères) et les valeurs sont les valeurs des variables?

{'foo': foo, 'bar': bar, 'baz': baz}

Maintenant que je suis re-poser la question, je suis venu avec:

d = {}
for name in list_of_variable_names:
    d[name] = eval(name)

Cela peut-il être amélioré?

Mise à jour, de répondre à la question (dans un commentaire) pourquoi je veux le faire:

Je me retrouve souvent à l'aide de l'opérateur % pour les chaînes avec un dictionnaire de noms et de valeurs à interpoler. Souvent le nom de la chaîne est juste les noms de variables locales. (Avec la réponse ci-dessous), je peux faire quelque chose comme ceci:

message = '''Name: %(name)s
ZIP: %(zip)s

Dear %(name)s,
...''' % dict((x, locals()[x]) for x in ['name', 'zip'])
Modding vers le bas. Je ne vois pas raisonnable de la situation de l'endroit où vous voulez le faire, et je ne vois pas de moyen de le rendre robuste, et certainement pas avec eval. Que faire si le nom de la liste de nom de obscurcit l'un des noms de l'intérêt, etc.
Réponse à la mise à jour en réponse à mon commentaire: Le langage Python pour le faire (que je ne supporte pas, mais je l'ai vu utilisé), est "string % des habitants (en)" directement.
Vous pouvez remplacer dict((x, locals()[...) par juste vars().
Exemple: a, b = 1, 'astring'; print("%(a)s %(b)s %(b)r" % vars())

OriginalL'auteur Daryl Spitzer | 2008-10-23