Affectation, variable et eval en python
Bonjour,
je dispose d'une variable, dont le nom est contenu dans une chaîne de caractère $a$ et j'aimerais affecter la valeur 2 à cette variable, j'ai donc tenté un $eval(a+"=2")$, mais cela ne donne rien.
De même $eval("a=3")$ n'affecte pas la valeur 3 à la variable a mais renvoie une erreur. J'imagine que cela signifie que la commande eval attend un résultat, comme par exemple dans $eval("2+3")$, et que la commande d'affectation $a=3$ ne renvoie rien.
Quelqu'un saurait-il comment effecteur cette opération.
D'avance merci.
Bonne journée
F.
je dispose d'une variable, dont le nom est contenu dans une chaîne de caractère $a$ et j'aimerais affecter la valeur 2 à cette variable, j'ai donc tenté un $eval(a+"=2")$, mais cela ne donne rien.
De même $eval("a=3")$ n'affecte pas la valeur 3 à la variable a mais renvoie une erreur. J'imagine que cela signifie que la commande eval attend un résultat, comme par exemple dans $eval("2+3")$, et que la commande d'affectation $a=3$ ne renvoie rien.
Quelqu'un saurait-il comment effecteur cette opération.
D'avance merci.
Bonne journée
F.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
-- Schnoebelen, Philippe
Par contre, je rencontre un autre souci:
dans une fonction $f$ d'une variable $a$,
j'utilise une variable locale $b$ fonction de $a$, que je dois utiliser pour modifier $a$. Or entre la définition de $b$ et son utilisation, la fonction modifie la valeur de $a$ et donc celle de $b$. D'où ma question, comment affecter une valeur fonction de $a$ à $b$ de façon à ce que la modification de $a$ n'entraîne pas celle de $b$. Un exemple : et une précision, $a$ n'est pas une liste mais une classe.
Bonne journée
-- Schnoebelen, Philippe
mais la méthode copy() est elle propre aux listes ou est-elle une méthode générale à tous les objets ?
Bonne journée
F.
Je pense que c’est le cas des objets non hashables comme les listes, les ensembles ou les dictionnaires.
Regarde en tapant dir([1,2]).
-- Schnoebelen, Philippe
La chose suivante a l'air de fonctionner
pour la méthode copie vu qu'il s'agit d'un type que j'ai crée, elle ne doit pas y être ;-)
si j'ai bien suivi, eval envoie une expression et attend un résultat, tandis qu'exec exécute une instruction sans rien attendre en retour ?
Bonne soirée
F.
-- Schnoebelen, Philippe
Oui c'est ça. Par contre, ça paraît assez bizarre et assez peu recommandé ce que tu veux faire (nommer une variable dans une string, notamment). Les méthodes eval et exec sont assez dangereuses, comme je l'ai expliqué récemment.
Peux-tu donner plus de contexte (pour tes 2 soucis, je t'avoue ne pas tout suivre au second) ?
Edit : typo
-- Schnoebelen, Philippe
j'essayais dans un arbre binaire de recherche de supprimer un entier $n$ donné, pour celà je cherchais le chemin menant à $n$, que j'obtenais sous la forme d'une chaîne de caractères $"a.fg.fd.fg"$, l'objet $a$ étant un objet de type noeux, comportant trois attributs : racine,fg et fd. Suivant la nature de $"a.fg.fd.fg"$, j'effectuais ensuite l'opération adéquate sur l'arbre initial via la commande eval ou exec.
Globalement je pense m'en être sorti, mais je ne vois pas comment me dispenser d'utiliser eval ou exec.
Bonne journée
F.
-- Schnoebelen, Philippe
Pour le debuggage : si ta chaîne "a.fg.fg.fd" est bugguée pour une raison ou une autre, c'est assez délicat : l'erreur n'apparaîtra que très tardivement (au moment du "eval") et il faut alors chercher ce que ne va pas dans un code généré dynamiquement. Et il y a pleins de raisons pour que ta chaîne devienne foireuse : tu changes ta classe Noeud et "fg" devient "fils_gauche", ta variable "a" devient "arbre", ...
Pour le design : pourquoi as-tu besoin de ce chemin ? Lorsque tu recherches ton entier, tu as ton noeud, pourquoi s'embêter à construire le chemin pour ensuit re-accéder à ton noeud ?
Pour la structure de donnée : si tu veux stocker un chemin, le plus adapté semble une liste des directions prises. Cette liste peut ensuite être convertie en chaine de caractères si on veut l'afficher en console, ou alors traitée par un autre programme pour afficher une succession d'images, ou traitée pour faire des stats sur le nombre de "gauche"/"droite"....
Si tu as vraiment besoin de ce chemin (j'en doute), tu peux faire une méthode (récursive) qui te renvoie deux choses : l'entier qui t'intéresse et la liste des directions à prendre pour accéder à cet entier (de la forme ["G", "D", "G"] par exemple). Je te le laisse en exercice, n'hésite pas à nous demander si tu es bloquée.
Mais avant tout : pourquoi as-tu besoin de ce chemin ?
merci de vos réponses.
Je n'ai pas besoin de ce fameux chemin pour trouver un entier n dans mon arbre, par contre j'en ai besoin pour trouver l'entier suivant n ou pour supprimer n.
Pour obtenir ce chemin, j'effectue effectivement une recherche récursive et le chemin que j'obtiens est dans un premier temps sous forme de liste .
Si par exemple, je veux supprimer l'entier n de mon arbre et que n n'est pas une feuille, je suis obligé de bricoler avec des eval/exec pour réussir à supprimer n.
Le plus propre serait sans doute de réussir à créer une méthode liée à la classe noeud prenant pour argument la liste de direction et renvoyant le suivant ou supprimant. Je vais essayer de creuser dans cette direction et je reviendrais vers vous en cas de problème.
Encore merci et bonne journée
F.
Utiliser une liste de chemin ne me semble pas adapté ici, il faut que tu puisses te promener dans ton arbre avec un truc du genre (avec nécessité de tester à chaque fois les None***) : Peux-tu nous copier/coller ta classe Noeud ?
Que veut dire "suivant" dans le contexte d'un arbre ?
D'une façon plus générale, quand tu as un soucis, tente de décrire ton soucis originel, pas le "soucis que tu as avec la solution X". Ça permettra d'avoir beaucoup plus vite une aide pertinente. Par exemple ici tu aurais pu poster
[size=x-small]*** si seulement on avait une "do notation" comme en Haskell....[/size]
une précision importante l'arbre que j'utilise est un arbre binaire de recherche. Alors le code de la classe noeud est:
La fonction pour supprimer un noeud est:
où la fonction chemin est:
@sebsheep, si j'ai bien compris ce que tu m'as dit, il conviendrait dans un premier temps modifier la classe noeud et d'y ajouter un attribut parent, puis de faire en sorte que la fonction suppr devienne une méthode de la classe noeud ?
Merci et bonne journée
F.
Ta structure me semble inutilement compliquée. Pourquoi utiliser les getattr et setattr et utiliser les arguments variables ? Ça ne me semble pas adapté ici (ça l'est dans certaines situations, mais ici, je n'ai pas l'impression).
Tu veux juste un arbre binaire dont les noeuds stockent un entier ? Bon ben je pense que le plus simple est d'avoir un noeud comme cela :
Je ne sais pas s'il faut conserver "supprimer" comme une méthode ou comme une fonction externe à la classe (je n'ai plus assez l'algo de suppression en tête). De même, je ne sais plus si on a vraiment besoin de "parent" ou "get_frere" (les méthodes "suivant/précédent" doivent suffire je pense.
Mais bon, en partant avec un code comme ça, tu auras déjà beaucoup plus facile de te dépatouiller.