84 votes

Convertir les entrées du dictionnaire en variables

Existe-t-il une méthode Pythonique pour assigner les valeurs d'un dictionnaire à ses clés, afin de convertir les entrées du dictionnaire en variables ? J'ai essayé ceci :

>>> d = {'a':1, 'b':2}
>>> for key,val in d.items():
        exec('exec(key)=val')

        exec(key)=val
                 ^ 
        SyntaxError: invalid syntax

Je suis certain que les paires clé-valeur sont correctes, car je les avais déjà définies comme variables auparavant. J'ai ensuite stocké ces variables dans un dictionnaire (en tant que paires clé-valeur) et j'aimerais les réutiliser dans une autre fonction. Je pourrais simplement les définir à nouveau dans la nouvelle fonction, mais comme j'ai un dictionnaire avec environ 20 entrées, j'ai pensé qu'il pourrait y avoir une façon plus efficace de le faire.

147voto

Peque Points 504

Vous pouvez le faire en une seule ligne avec :

>>> d = {'a': 1, 'b': 2}
>>> locals().update(d)
>>> a
1

Toutefois, il convient d'être prudent avec comment Python peut optimiser l'accès aux locales/globales en utilisant cette astuce .

Note

Je pense que l'édition locals() comme cela est généralement une mauvaise idée. Si vous pensez que globals() est une meilleure alternative, réfléchissez-y à deux fois ! :-D

Au lieu de cela, je préfère toujours utiliser un espace de noms.

Avec Python 3, vous pouvez :

>>> from types import SimpleNamespace    
>>> d = {'a': 1, 'b': 2}
>>> n = SimpleNamespace(**d)
>>> n.a
1

Si vous êtes coincé avec Python 2 ou si vous avez besoin d'utiliser certaines fonctionnalités manquantes dans types.SimpleNamespace vous pouvez également :

>>> from argparse import Namespace    
>>> d = {'a': 1, 'b': 2}
>>> n = Namespace(**d)
>>> n.a
1

Si vous n'avez pas l'intention de modifier vos données, vous pouvez tout aussi bien envisager d'utiliser collections.namedtuple également disponible en Python 3.

56voto

HappyPy Points 1798

C'est ce que je recherchais :

>>> d = {'a':1, 'b':2}
>>> for key,val in d.items():
        exec(key + '=val')

32voto

user2357112 Points 37737

Vous avez déjà un très bon dictionnaire. Utilisez-le. Si vous savez quelles seront les clés, et que vous êtes absolument sûr que c'est une idée raisonnable, vous pouvez faire quelque chose comme

a, b = d['a'], d['b']

mais la plupart du temps, il est préférable d'utiliser le dictionnaire. (Si l'utilisation du dictionnaire est gênante, c'est probablement que vous n'organisez pas bien vos données ; demandez de l'aide pour les réorganiser).

16voto

suhail Points 2520

Vous pouvez utiliser operator.itemgetter

>>> from operator import itemgetter
>>> d = {'a':1, 'b':2}
>>> a, b = itemgetter('a', 'b')(d)
>>> a
1
>>> b
2

12voto

tdelaney Points 7235

Considérons la solution "Bunch" dans Python : charger les variables d'un dict dans un espace de noms . Vos variables finissent par faire partie d'un nouvel objet, et non de locaux, mais vous pouvez les traiter comme des variables plutôt que comme des entrées de dict.

class Bunch(object):
    def __init__(self, adict):
        self.__dict__.update(adict)

d = {'a':1, 'b':2}
vars = Bunch(d)
print vars.a, vars.b

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X