Bonjour, je cherche à faire une fonction pour faciliter certaines tâches dans mes programmes et permettre d'afficher les informations qui m'intéressent. J'ai donc besoin de récupérer le nom d'une variable pour pouvoir print quelque chose du genre : mavariable = 10. J'ai trouvé des solutions faisant intervenir traceback mais je n'aime pas car ça ne permet pas de rajouter des arguments à ma fonction sans prévoir tous les cas de figure. Existe t-il une méthode simple pour récupérer le nom de cette variable en python 3.0 ?
Je vous glisse mon bout de code actuel :
import traceback
from math import *
def display(variable) :
stack = traceback.extract_stack(limit=2)
print(stack[0][3].replace('ps.display(', '').replace(')', '')," = ",variable)
Apparemment variable prend une valeur spécifique, il serait bien de donner les valeurs que peut prendre ton paramètre variable dans la fonction display.
Quels exemples pourrais-tu donner ?
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard) La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
Désolé si ce n'est pas clair en gros je rentre les lignes suivantes :
import lib.print_show as ps
test = 10
ps.display(test)
Et en sortie je voudrais quelque chose comme ça :
test = 10
Sans avoir à coder en dur le nom de la variable pour pouvoir appeler cette fonction n'importe où. pour que si par exemple la variable s'appelle toto on ait :
C'pas possible, quand tu fais display(test), l'argument traité pas la fonction display, c'est n'est pas la variable test, c'est l'objet référencé par ma variable test (ici un objet de type int).
Solution : utilise un dictionnaire : display({"test": 10})
- Edité par thelinekioubeur 3 juin 2021 à 11:24:33
Merci pour votre réponse je viens de tester ça fonctionne bien si le code est exécuté dans le programme principal mais en le couplant à une fonction elle renvoie :
test = 10
ps.display(test)
>>variable = 10
Elle ne récupère pas la variable donnée mais celle crée dans la fonction.
ben oui, dans la fonction, l'objet est référencé par le nom du paramètre
Ça n'a aucun sens de vouloir récupérer un nom de variable, et c'est de toute façon impossible de trouve le nom d'une variable à partir d'un objet (puisqu'il peut être référencé par plusieurs variables).
Ton truc avec traceback récupère juste la ligne de code, et ne supportera pas un niveau d'encapsulation.
D'ailleurs pourrait tu nous éclairer sur le contexte ? Tu essayes de coder quoi ?
- Edité par thelinekioubeur 3 juin 2021 à 14:17:02
En soit je veux pas le nom de l'objet mais directement celui de la variable.
Oui c'est pour ça que le traceback ne me plaît pas vraiment et que je voulais le changer pour quelque chose de plus propre.
Pour ce qui est du contexte il n'y en a pas vraiment en soit si ce n'est me faciliter la vie quand j'essaie de voir le comportement de mes programmes. Pour remplacer par exemple le bon vieux print("variable",variable,type(variable)).
J'aurais tendance à la jouer un peu comme @umfred :
def var_name(var, dir=locals()):
return [key for key, val in dir.items() if id(val) == id(var)]
name = "Diablo76"
print(f"{var_name(name)[0]} = {name}")
Ou en décomposant :
def var_name(var, dir=locals()):
for key, val in dir.items():
if id(val) == id(var):
return key
name = "Diablo76"
print(f"{var_name(name)} = {name}")
Ça ne marche plus si tu a deux variables égales, ni si tu utilise ta fonction depuis une autre fonction...
def var_name(var, dir=locals()):
return [key for key, val in dir.items() if id(val) == id(var)]
a = "Diablo76"
name = "Diablo76"
print(f"{var_name(name)[0]} = {name}")
def foo():
test = "riri"
print(var_name("riri"))
foo()
C'est de toute façon impossible de faire une fonction qui marchera dans tous les cas, un objet pouvant être référencé plusieurs fois.
Jouer à faire quoi en fait, son intérêt est le debug, donc print et pdb c'est très bien pour faire ça, pas besoin de plus.
Plus de confort serait d'utiliser l'outil de debug de son IDE...
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard) La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
J'aurais tendance à la jouer un peu comme @umfred :
def var_name(var, dir=locals()):
return [key for key, val in dir.items() if id(val) == id(var)]
name = "Diablo76"
print(f"{var_name(name)[0]} = {name}")
C'est plus ou moins ce que propose Python 3.8 (pour du debug justement) :
def var_name(var, dir=locals()):
return [key for key, val in dir.items() if id(val) == id(var)]
name = "Diablo76"
print(f"Je vérifie : {name =}")
@StephaneD_974 Bonjour, merci de ne pas déterrer d'ancien sujet et de répondre au plus récent et ce dans le respect des règles du forum.
Le message qui suit est une réponse automatique activée par un membre de l'équipe de modération. Les réponses automatiques leur permettent d'éviter d'avoir à répéter de nombreuses fois la même chose, ce qui leur fait gagner du temps et leur permet de s'occuper des sujets qui méritent plus d'attention. Nous sommes néanmoins ouverts et si vous avez une question ou une remarque, n'hésitez pas à contacter la personne en question par Message Privé. Pour plus d'informations, nous vous invitons à lire les règles générales du forum
Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.
Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre. En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.
Au lieu de déterrer un sujet il est préférable :
soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
soit de créer un nouveau sujet décrivant votre propre contexte
ne pas répondre à un déterrage et le signaler à la modération
PB68
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
Elle ne récupère pas la variable donnée mais celle crée dans la fonction.
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
Découverte Python Doc Tkinter Les chaînes de caractères