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'
Ce n'est pas très Pythonesque mais j'étais curieux et j'ai trouvé cette solution. Il faut dupliquer le dictionnaire globals car sa taille changera dès que vous définirez une nouvelle variable.
def var_to_name(var):
# noinspection PyTypeChecker
dict_vars = dict(globals().items())
var_string = None
for name in dict_vars.keys():
if dict_vars[name] is var:
var_string = name
break
return var_string
if __name__ == "__main__":
test = 3
print(f"test = {test}")
print(f"variable name: {var_to_name(test)}")
qui renvoie :
test = 3
variable name: test
Merci @restrepo, c'est exactement ce dont j'avais besoin pour créer une fonction standard save_df_to_file(). Pour cela, j'ai apporté quelques petites modifications à votre fonction tostr(). J'espère que cela aidera quelqu'un d'autre :
def variabletostr(**df):
variablename = list(df.keys())[0]
return variablename
variabletostr(df=0)
La question initiale est assez ancienne, mais j'ai trouvé une réponse à cette question. presque (Je dis presque car je pense que l'on peut s'approcher d'une solution mais je ne crois pas qu'il existe une solution suffisamment concrète pour répondre à la demande exacte).
Tout d'abord, vous pouvez prendre en considération les éléments suivants :
var
est juste un nom de variable lié à un objet et cet objet peut avoir plus d'une référence (dans votre exemple, cela ne semble pas être le cas).var
semble se trouver dans l'espace de noms global et vous pouvez donc utiliser la fonction globale builtin
bien nommée global
id
ce qui peut être vérifié en exécutant la commande id builtin
id
comme suit : id(var)
Cette fonction récupère les variables globales et filtre celles qui correspondent à l'attribut contenu de votre variable.
def get_bound_names(target_variable):
'''Returns a list of bound object names.'''
return [k for k, v in globals().items() if v is target_variable]
La véritable difficulté réside dans le fait qu'il n'est pas garanti que vous récupériez le nom de la variable en tant que tel. Il s'agira d'une liste, mais cette liste contiendra le nom de la variable que vous recherchez. Si votre variable cible (liée à un objet) est vraiment le seul nom lié, vous pouvez y accéder de cette manière :
bound_names = get_variable_names(target_variable)
var_string = bound_names[0]
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 !