Re,
Petit oubli: Plus mes 'pseudo' questions sur le coté dynamique de tout cela.
Mais en fait on est bien loin de la question posée par Thibqult: Comment utiliser getattr (et en particulier son premier argument) dans le __main__
@++
Re,
Petit oubli: Plus mes 'pseudo' questions sur le coté dynamique de tout cela.
Mais en fait on est bien loin de la question posée par Thibqult: Comment utiliser getattr (et en particulier son premier argument) dans le __main__
@++
je ne suis pas tout à fait d'accord, le PO dit
Il propose getattr, mais la solution avec globals n'est pas mauvaise je pense.J'essaye de comprendre comment appeller une fonction seulement à partir de son nom (stocké dans un string)
Ce que je ne comprend pas, c'est l'intérêt d'appeler une fonction par son nom version chaine de caractères, je pense à un problème de conception de son code.
En plus getattr(), en ce qui me concerne je ne le vois que comme un retour d'une valeur d'attribut d'objet, un genre de objet.nom
Exact fred1599 pour ce qui est de la question.
Maintenant pour ce qui est du problème de conception je pense plus à un problème de compréhension, d’où le getattr.
Je pense qu'il va falloir attendre une réponse du PO.
@+
Quand j'ai commencé à travailler en Python, venant du C, je ne comprenais pas non plus l'intérêt d'accéder aux attributs des instances via getattr, en fournissant donc le nom du "champ" sous forme de chaine de caractères. L'idée même que 2 instances d'une même classe n'aient pas nécessairement les mêmes attributs m'avait surpris (pour ne pas dire choqué). Et puis, j'ai appris à m'en servir. Et puis j'ai trouvé ça bien pratique et, au final, bien plus propre.Envoyé par fred1599
En C, dans les structures (identiques pour toutes les variables de ce type), il fallait parfois bien mettre "quelque chose", même si le contexte faisait que le champ n'avait pas lieu d'être. Donc, j'y collais une "valeur impossible" ou je passais par des unions ou encore je prévoyais un champ supplémentaire juste là pour dire "ben le champ X on s'en fout, y veut rien dire et faut pas s'en occuper". En Python, je teste l'existence via hasattr et je trouve ça bien plus propre.
Pour le sujet de cette discussion (auquel j'avais répondu, la toute première fois en parlant de globals(), j'avais mis un grand '?' final. C'était uniquement parce que je savais que ça "marchait" mais sans être sur que c'était une bonne façon de faire. Je voulais simplement avoir différents avis, sans me fermer de porte (en me rappelant que "accéder à un champ via son nom (getattr) quelle bizarrerie !" des mes débuts pythonesques, enkylosé par 20 ans de C (qui a ses atouts et que je ne renie pas !)).
Donc, le sujet de mon dernier post était de savoir si on pouvait se garder le "globals()" sous le coude au cas où, ou s'il fallait le proscrire à tout jamais (comme les goto ?).
Vos avis (PauseKawa, Wiztricks, Fred1599, Tyrtamos) m'aident à progresser : merci !
Attention, j'ai pas dis ça!Envoyé par plxpy
getattr, je le trouve très utile pour retourner la valeur de l'attribut d'un objet.
D'ailleurs je le dis bien
Envoyé par fred1599
Toujours d'accord, même si j'ai fais très très peu de CEnvoyé par plxpy
La clef du problème est là, globals dans son cas, qui me paraît louche, est la seule solution!!!Envoyé par plxpy
getattr() ne fait pas la même chose, il recherche un attribut de l'objet.
N'y a-t-il pas confusion entre attribut et fonction?
Pour moi clairement oui, d'où son problème de conception, il y a d'autres façon d'appeler une fonction.Envoyé par plxpy
Pourquoi ne pas appeler sa fonction directement, y-a-t-il un exemple où nous sommes obligés d'appeler une fonction par sa chaîne?
idemEnvoyé par plxpy
Bonjour,
Pour moi, utiliser globals, getattr, etc..., c'est utiliser la "machinerie" interne de Python: ce n'est pas du codage "normal". Je l'évite donc le plus possible, et je ne l'utilise que quand je ne peux vraiment pas faire autrement (et c'est plutôt rare).
Par contre, pour construire un module de type "bibliothèque" avec des fonctions qui manquent à Python, j'accepte de les utiliser parce que je suis dans un cadre "système".
Mais rien n'empêche de s'amuser avec ces fonctions pour des codages "hors production", parce que justement, ça permet de mieux comprendre comment fonctionne Python...![]()
A noter toutefois que l’utilisation de la 'machinerie interne' (globals() ici) est plus rapide: A oublier ? Non.
Ceci dit rien ne dit que le namespace reste sous la forme d'un dico...
Partager