224 votes

Comment obtenir un nom de variable comme une chaîne de caractères en Python?

Je voudrais être en mesure d'obtenir le nom d'une variable comme une chaîne de caractères, mais je ne sais pas si Python est que beaucoup de capacités d'introspection. Quelque chose comme:

>>> print(my_var.__name__)
'my_var'

Je veux le faire parce que j'ai un tas de vars j'aimerais tourner dans un dictionnaire comme :

bar=True
foo=False
>>> my_dict=dict(bar=bar, foo=foo)
>>> print mydict
>>> print my_dict 
{'foo': False, 'bar': True}

Mais j'aimerais quelque chose de plus automatique que cela.

Python ont locals() et vars(), donc je suppose qu'il y a un moyen.

131voto

rlotun Points 3995

Comme détendez-vous dit, ce n'est pas vraiment quelque chose que vous faites en Python variables sont en fait des mappages de noms d'objets.

Cependant, voici un moyen pour essayer de le faire:

 >>> a = 1
 >>> for k, v in list(locals().iteritems()):
         if id(v) == id(a):
             a_as_str = k
 >>> a_as_str
 a
 >>> type(a_as_str)
 'str'

63voto

keflavich Points 2310

J'ai voulu faire ce beaucoup. Ce hack est très similaire à rlotun de la suggestion, mais c'est un one-liner, ce qui est important pour moi:

blah = 1
blah_name = [ k for k,v in locals().iteritems() if v is blah][0]

47voto

S.Lott Points 207588

Êtes-vous essayer de faire ça?

dict( (name,eval(name)) for name in ['some','list','of','vars'] )

Exemple

>>> some= 1
>>> list= 2
>>> of= 3
>>> vars= 4
>>> dict( (name,eval(name)) for name in ['some','list','of','vars'] )
{'list': 2, 'some': 1, 'vars': 4, 'of': 3}

17voto

unutbu Points 222216

C'est un hack. Il ne fonctionnera pas sur tous les implémentations de Python distributions (en particulier, ceux qui n'ont pas d' traceback.extract_stack.)

import traceback

def make_dict(*expr):
    (filename,line_number,function_name,text)=traceback.extract_stack()[-2]
    begin=text.find('make_dict(')+len('make_dict(')
    end=text.find(')',begin)
    text=[name.strip() for name in text[begin:end].split(',')]
    return dict(zip(text,expr))

bar=True
foo=False
print(make_dict(bar,foo))
# {'foo': False, 'bar': True}

Notez que ce hack, est fragile:

make_dict(bar,
          foo)

(l'appel de make_dict sur 2 lignes) ne fonctionnera pas.

Au lieu d'essayer de générer le dict de l' valeurs foo et bar, il serait beaucoup plus Pythonic pour générer le dict de la chaîne les noms de variable 'foo' et 'bar':

dict([(name,locals()[name]) for name in ('foo','bar')])

14voto

unwind Points 181987

Ce n'est pas possible en Python, ce qui n'est pas vraiment "variables". Python a des noms, et il peut y avoir plus d'un nom pour le même objet.

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