J'aimerais convertir un nom de variable python en son équivalent en chaîne de caractères, comme indiqué. Comment faire ?
var = {}
print ??? # Would like to see 'var'
something_else = 3
print ??? # Would print 'something_else'
J'aimerais convertir un nom de variable python en son équivalent en chaîne de caractères, comme indiqué. Comment faire ?
var = {}
print ??? # Would like to see 'var'
something_else = 3
print ??? # Would print 'something_else'
Techniquement, l'information est à votre disposition, mais comme d'autres l'ont demandé, comment l'utiliser de manière sensée ?
>>> x = 52
>>> globals()
{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__',
'x': 52, '__doc__': None, '__package__': None}
Cela montre que le nom de la variable est présent sous forme de chaîne dans le dictionnaire globals().
>>> globals().keys()[2]
'x'
Dans ce cas, il s'agit de la troisième clé, mais il n'y a pas de moyen fiable de savoir où un nom de variable donné aboutira
>>> for k in globals().keys():
... if not k.startswith("_"):
... print k
...
x
>>>
Vous pourriez filtrer les variables du système de cette manière, mais vous obtiendrez toujours tous vos propres éléments. Le simple fait d'exécuter le code ci-dessus a créé une autre variable "k" qui a modifié la position de "x" dans le dict.
Mais peut-être s'agit-il d'un début utile pour vous. Si vous nous dites à quoi vous destinez cette capacité, nous pourrons peut-être vous fournir des informations plus utiles.
Vous devez en quelque sorte faire référence à la variable dont vous voulez imprimer le nom. Cela ressemblerait donc à
print varname(something_else)
Cette fonction n'existe pas, mais si elle existait, elle serait en quelque sorte inutile. Il faut taper something_else
Il suffit donc de taper des guillemets à gauche et à droite pour imprimer le nom sous forme de chaîne de caractères :
print "something_else"
Quels sont vos objectifs ? Il n'y a absolument aucune raison de faire ce que vous décrivez, et il existe probablement une bien meilleure solution au problème que vous essayez de résoudre.
L'alternative la plus évidente à ce que vous demandez est un dictionnaire. Par exemple :
>>> my_data = {'var': 'something'}
>>> my_data['something_else'] = 'something'
>>> print my_data.keys()
['var', 'something_else']
>>> print my_data['var']
something
J'ai implémenté le résultat que vous souhaitiez. N'utilisez pas ce code, s'il vous plaît !
#!/usr/bin/env python2.6
class NewLocals:
"""Please don't ever use this code.."""
def __init__(self, initial_locals):
self.prev_locals = list(initial_locals.keys())
def show_new(self, new_locals):
output = ", ".join(list(set(new_locals) - set(self.prev_locals)))
self.prev_locals = list(new_locals.keys())
return output
# Set up
eww = None
eww = NewLocals(locals())
# "Working" requested code
var = {}
print eww.show_new(locals()) # Outputs: var
something_else = 3
print eww.show_new(locals()) # Outputs: something_else
# Further testing
another_variable = 4
and_a_final_one = 5
print eww.show_new(locals()) # Outputs: another_variable, and_a_final_one
Est-ce que Django ne fait pas cela lors de la génération des noms de champs ?
http://docs.djangoproject.com/en/dev//topics/db/models/#verbose-field-names
Cela me semble raisonnable.
Je pense que c'est une bonne solution et je suppose que c'est la meilleure que l'on puisse obtenir. Mais voyez-vous un moyen de gérer les résultats ambigus que votre fonction peut renvoyer ? En tant que L'opérateur "is" se comporte de manière inattendue avec les entiers montre que les entiers faibles et les chaînes de même valeur sont mis en cache par Python, de sorte que votre fonction variablename peut produire des résultats ambigus avec une forte probabilité. Dans mon cas, j'aimerais créer un décorateur, qui ajoute une nouvelle variable à une classe par le nom de variable que je lui passe :
def inject(klass, dependency):
klass.__dict__["__"+variablename(dependency)]=dependency
Mais si votre méthode renvoie des résultats ambigus, comment puis-je connaître le nom de la variable que j'ai ajoutée ?
var any_var="myvarcontent"
var myvar="myvarcontent"
@inject(myvar)
class myclasss():
def myclass_method(self):
print self.__myvar #I can not be sure, that this variable will be set...
Si je vérifie également la liste locale, je pourrai peut-être au moins supprimer la variable "dépendance" de la liste, mais le résultat ne sera pas fiable.
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.
1 votes
Pourriez-vous préciser ce que vous essayez de faire ? Il semble que vous demandiez comment résoudre un problème de la mauvaise manière. Il y a aussi une question similaire, mais à propos de Ruby stackoverflow.com/questions/58482/ruby-get-a-variables-name
1 votes
J'ai vérifié cette question car, en utilisant RPy2, je veux passer une variable Python avec un nom R éponyme. Un exemple inutile (mais proche de mon application) :
def to_R( py_var ): r.assign( 'py_var', py_var )
pour assigner les données de (Py) py_var à l'environnement R et avoir le même nom. Ce serait utile pour moi de le faire à la place,r.assign( py_var.stringof, py_var )
a la D puisque le nom de la variable passée à ma fnto_r
n'est pas nécessairementpy_var
.4 votes
L'une des façons de l'utiliser est lorsqu'une déclaration Assert échoue. Vous pouvez fournir à l'utilisateur le nom exact de la variable en question tout en conservant votre code générique, par exemple AssertionError : 'something_else' must be a number greater than 5 (erreur d'affirmation : 'quelque chose_autre' doit être un nombre supérieur à 5). Vous pouvez alors tester chaque variable qui doit être supérieure à 5 et obtenir le nom de la variable dans le message AssertionError.
0 votes
Heureusement qu'il existe une question sur la façon de faire cela en Ruby !