102 votes

Convertir le nom de la variable en chaîne ?

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'

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 fn to_r n'est pas nécessairement py_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.

0voto

Hadsbjerg Points 39

Cela fonctionnera pour des types de données simples (str, int, float, list, etc.).

\>>> def my\_print(var\_str) : 
      print var\_str+':', globals()\[var\_str\]
>>> a = 5
>>> b = \['hello', ',world!'\]
>>> my\_print('a')
a: 5
>>> my\_print('b')
b: \['hello', ',world!'\]

0voto

Frenmerican Points 1

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

0voto

tamtam Points 106

Pour obtenir le nom de la variable var sous la forme d'une chaîne de caractères :

var = 1000
var_name = [k for k,v in locals().items() if v == var][0] 
print(var_name) # ---> outputs 'var'

0voto

Arend Points 115

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)

0voto

Jesse H. Points 53

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 :

  • les objets sont un concept central de Python, et une variable peut leur être assignée, mais la variable elle-même est un nom lié (pensez à un pointeur ou à une référence) et non l'objet lui-même.
  • 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).
  • dans ce cas, var semble se trouver dans l'espace de noms global et vous pouvez donc utiliser la fonction globale builtin bien nommée global
  • les références de noms différents au même objet partageront toutes le même 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.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