Je veux créer des variables dynamiquement via une boucle while en Python. Quelqu'un at-il un moyen créatif de le faire?
À moins qu'il ne soit absolument nécessaire de créer un fouillis de noms de variables, je voudrais simplement utiliser un dictionnaire, dans lequel vous pouvez créer dynamiquement les noms de clé et associer une valeur à chacun.
a = {}
k = 0
while k < 10:
<dynamically create key>
key = ...
<calculate value>
value = ...
a[key] = value
k += 1
Il existe également des structures de données intéressantes dans le nouveau module "Collections" qui pourraient être applicables:
jouer avec globals () permet:
import random
alphabet = Tuple('abcdefghijklmnopqrstuvwxyz')
print '\n'.join(repr(u) for u in globals() if not u.startswith('__'))
for i in xrange(8):
globals()[''.join(random.sample(alphabet,random.randint(3,26)))] = random.choice(alphabet)
print
print '\n'.join(repr((u,globals()[u])) for u in globals() if not u.startswith('__'))
un résultat:
'alphabet'
'random'
('hadmgoixzkcptsbwjfyrelvnqu', 'h')
('nzklv', 'o')
('alphabet', ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'))
('random', <module 'random' from 'G:\Python27\lib\random.pyc'>)
('ckpnwqguzyslmjveotxfbadh', 'f')
('i', 7)
('xwbujzkicyd', 'j')
('isjckyngxvaofdbeqwutl', 'n')
('wmt', 'g')
('aesyhvmw', 'q')
('azfjndwhkqgmtyeb', 'o')
J'ai utilisé aléatoire parce que vous n'expliquez pas les noms des "variables" à donner et les valeurs à créer. Parce que je ne pense pas qu'il soit possible de créer un nom sans le lier à un objet.
Utilisez la méthode exec (). Par exemple, supposons que vous possédiez un dictionnaire et que vous souhaitiez transformer chaque clé en une variable avec sa valeur de dictionnaire d'origine.
Python 2
>>> c = {"one": 1, "two": 2}
>>> for k,v in c.iteritems():
... exec("%s=%s" % (k,v))
>>> one
1
>>> two
2
Python
>>> c = {"one": 1, "two": 2}
>>> for k,v in c.items():
... exec("%s=%s" % (k,v))
>>> one
1
>>> two
2
Insérer des éléments dans les espaces de noms globaux et/ou locaux n'est pas une bonne idée. Utiliser un dict est tellement bizarre ... d['constant-key'] = value
a l'air bizarre. Python est OO. Comme le dit un maître: "" "Les espaces de noms sont une bonne idée: faisons-en plus!" ""
Comme ça:
>>> class Record(object):
... pass
...
>>> r = Record()
>>> r.foo = 'oof'
>>> setattr(r, 'bar', 'rab')
>>> r.foo
'oof'
>>> r.bar
'rab'
>>> names = 'id description price'.split()
>>> values = [666, 'duct tape', 3.45]
>>> s = Record()
>>> for name, value in Zip(names, values):
... setattr(s, name, value)
...
>>> s.__dict__ # If you are suffering from dict withdrawal symptoms
{'price': 3.45, 'id': 666, 'description': 'duct tape'}
>>>
NOTE: Ceci devrait être considéré comme une discussion plutôt que comme une réponse réelle.
Une approche approximative consiste à utiliser __main__
dans le module avec lequel vous souhaitez créer des variables. Par exemple, il y a un b.py
:
#!/usr/bin/env python
# coding: utf-8
def set_vars():
import __main__
print '__main__', __main__
__main__.B = 1
try:
print B
except NameError as e:
print e
set_vars()
print 'B: %s' % B
En cours d'exécution il sortirait
$ python b.py
name 'B' is not defined
__main__ <module '__main__' from 'b.py'>
B: 1
Mais cette approche ne fonctionne que dans un seul script de module, car __main__
il importera toujours le module du script d’entrée exécuté par python, cela signifie que si b.py
est impliqué par un autre code, le La variable B
sera créée dans la portée du script d'entrée plutôt que dans b.py
lui-même. Supposons qu'il existe un script a.py
:
#!/usr/bin/env python
# coding: utf-8
try:
import b
except NameError as e:
print e
print 'in a.py: B', B
En cours d'exécution il sortirait
$ python a.py
name 'B' is not defined
__main__ <module '__main__' from 'a.py'>
name 'B' is not defined
in a.py: B 1
Notez que le __main__
est remplacé par 'a.py'
.
Paramètres de mot-clé vous permettent de passer des variables d'une fonction à une autre. De cette façon, vous pouvez utiliser la clé d'un dictionnaire comme nom de variable (pouvant être rempli dans votre boucle while
). Le nom du dictionnaire doit simplement être précédé de **
quand il est appelé.
# create a dictionary
>>> kwargs = {}
# add a key of name and assign it a value, later we'll use this key as a variable
>>> kwargs['name'] = 'python'
# an example function to use the variable
>>> def print_name(name):
... print name
# call the example function
>>> print_name(**kwargs)
python
Sans **
, kwargs
n'est qu'un dictionnaire:
>>> print_name(kwargs)
{'name': 'python'}
vars()['meta_anio_2012'] = 'translate'