web-dev-qa-db-fra.com

Changer les noms de variables avec Python pour les boucles

Je me demandais simplement si quelqu'un connaissait un moyen de changer les noms de variables en fonction d'une boucle for pour quelque chose comme ceci:

for i in range(3)
     group+i=self.getGroup(selected, header+i)

de sorte que les noms des variables changent pour accueillir les données. Merci!

~ Sam

23
user130633

Vous voulez probablement un dict au lieu de variables distinctes. Par exemple

d = {}
for i in range(3):
    d["group" + str(i)] = self.getGroup(selected, header+i)

Si vous insistez pour modifier réellement les variables locales, vous pouvez utiliser la fonction locals:

for i in range(3):
    locals()["group"+str(i)] = self.getGroup(selected, header+i)

D'un autre côté, si vous voulez réellement modifier les variables d'instance de la classe dans laquelle vous vous trouvez, vous pouvez utiliser la fonction setattr

for i in group(3):
    setattr(self, "group"+str(i), self.getGroup(selected, header+i)

Et bien sûr, je suppose avec tous ces exemples que vous ne voulez pas seulement une liste:

groups = [self.getGroup(i,header+i) for i in range(3)]
43
Eli Courtwright

Utilisez une liste.

groups = [0]*3
for i in xrange(3):
    groups[i] = self.getGroup(selected, header + i)

ou plus "Pythoniquement":

groups = [self.getGroup(selected, header + i) for i in xrange(3)]

Pour ce que ça vaut, vous pourriez essayer de créer des variables dans le "mauvais" sens, c'est-à-dire en modifiant le dictionnaire qui contient leurs valeurs:

l = locals()
for i in xrange(3):
    l['group' + str(i)] = self.getGroup(selected, header + i)

mais c'est vraiment une mauvaise forme, et peut-être même pas garanti de fonctionner.

8
David Z

Il semble que vous souhaitiez utiliser une liste à la place:

group=[]
for i in range(3):
     group[i]=self.getGroup(selected, header+i)
2
Greg Hewgill

Je devrais certainement utiliser un dict en utilisant la touche "group" + str (i) comme décrit dans la solution acceptée mais je voulais partager une solution en utilisant exec. C'est un moyen d'analyser des chaînes en commandes et de les exécuter dynamiquement. Cela permettrait de créer ces noms de variables scalaires selon vos besoins au lieu d'utiliser un dict. Cela pourrait vous aider à ne pas faire, et ce n'est pas parce que vous le pouvez que vous devriez le faire. C'est une bonne solution uniquement si l'utilisation de variables scalaires est une exigence difficile:

l = locals()
for i in xrange(3):
    exec("group" + str(i) + "= self.getGroup(selected, header + i)")

Un autre exemple où cela pourrait fonctionner en utilisant un exemple de modèle Django. La solution alternative exec est commentée et la meilleure façon de gérer un tel cas en utilisant le dict l'attribut a plus de sens:

Class A(models.Model):

    ....

    def __getitem__(self, item):  # a.__getitem__('id')
        #exec("attrb = self." + item)
        #return attrb
        return self.__dict__[item]

Il peut être plus judicieux d'étendre à partir d'un dictionnaire en premier lieu pour obtenir les fonctions setattr et getattr.

Une situation qui implique l'analyse, par exemple la génération et l'exécution de commandes python dynamiquement, exec est ce que vous voulez :) Plus d'informations sur exec ici .

2
radtek