web-dev-qa-db-fra.com

Attribuer plusieurs variables à la fois avec des noms de variables dynamiques

Je sais que je peux affecter plusieurs variables à plusieurs valeurs à la fois avec:

(foo, bar, baz) = 1, 2, 3

Et avoir foo = 1, bar = 2, et ainsi de suite.

Mais comment pourrais-je rendre les noms des variables plus dynamiques? C'est à dire,

somefunction(data,tupleofnames):
    (return that each name mapped to a single datum)

somefunction((1,2,3),(foo,bar,baz))     

Et avoir la même chose?

20
mikemaccana

Que dis-tu de ça?

def somefunction(data, tupleofnames):
    length = len(tupleofnames)
    for i in range(0, length):
        globals()[tupleofnames[i]] = data[i]

Ici, je suppose que les données et les tupleofnames sont des listes où tupleofnames est une liste de chaînes. Mais comme Thomas l'a mentionné, ce n'est pas une bonne pratique. Il peut facilement corrompre votre application.

10
freakish

Il y a des façons de le faire, mais ce ne sont pas de bonnes manières, et c'est considéré comme une mauvaise pratique en Python. Les nouvelles variables ne doivent pas être créées par magie. Si vous voulez avoir une collection de choses, utilisez une liste, un dictionnaire ou un ensemble, selon le cas.

Par exemple, vous pouvez renvoyer un dictionnaire: {"foo":1, "bar":2, "baz":3}

13
Thomas K

Si les dictionnaires ne sont pas ce que vous voulez, alors peut-être que les tuples nommés sont le chemin à parcourir: ils permettent la création efficace de plusieurs instances de données regroupées, avec des attributs nommés.

http://docs.python.org/library/collections.html#collections.namedtuple

from collections import namedtuple


mytype = namedtuple("mytype", "foo bar baz")

a = mytype(1,2,3)
a.foo
1
a.bar
2
a.baz
 3
6
jsbueno

Vous pouvez le faire comme ceci:

    (foo, bar, baz) = (1, 2, 3)
5
Stefan Gruenwald

Consultez les documents d'aide pour Zip & map. par exemple. pour Zip: -

>>>  Zip( (1,2,3) , ('foo','bar','baz') )
[(1, 'foo'), (2, 'bar'), (3, 'baz')] 

map nécessite une fonction pour cartographier les séquences ensemble. Mais, vous pouvez utiliser None au lieu d'une fonction pour retourner les mêmes résultats que Zip, ci-dessus.

>>> map( None, (1,2,3) , ('foo','bar','baz') )                                                                                       
[(1, 'foo'), (2, 'bar'), (3, 'baz')]
3
Alex Leach