IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Appeller une fonction avec un string


Sujet :

Python

  1. #21
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    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__

    @++

  2. #22
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 049
    Par défaut
    je ne suis pas tout à fait d'accord, le PO dit

    J'essaye de comprendre comment appeller une fonction seulement à partir de son nom (stocké dans un string)
    Il propose getattr, mais la solution avec globals n'est pas mauvaise je pense.

    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

  3. #23
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    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.

    @+

  4. #24
    Membre Expert Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Par défaut
    Citation Envoyé par fred1599
    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.
    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.

    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 !

  5. #25
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 049
    Par défaut
    Citation Envoyé par plxpy
    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.
    Attention, j'ai pas dis ça!

    getattr, je le trouve très utile pour retourner la valeur de l'attribut d'un objet.

    D'ailleurs je le dis bien

    Citation Envoyé par fred1599
    je ne le vois que comme un retour d'une valeur d'attribut d'objet, un genre de objet.nom
    Citation Envoyé par plxpy
    En Python, je teste l'existence via hasattr et je trouve ça bien plus propre.
    Toujours d'accord, même si j'ai fais très très peu de C

    Citation Envoyé par plxpy
    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 !)).
    La clef du problème est là, globals dans son cas, qui me paraît louche, est la seule solution!!!

    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?

    Citation Envoyé par plxpy
    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 ?).
    Pour moi clairement oui, d'où son problème de conception, il y a d'autres façon d'appeler une fonction.

    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?

    Citation Envoyé par plxpy
    Vos avis (PauseKawa, Wiztricks, Fred1599, Tyrtamos) m'aident à progresser : merci !
    idem

  6. #26
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    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...

  7. #27
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    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...

Discussions similaires

  1. Appeler une fonction avec un string
    Par wazzzzza dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 01/02/2011, 12h56
  2. Appel de fonction avec un string
    Par james_kirk dans le forum Windows Forms
    Réponses: 4
    Dernier message: 26/04/2008, 04h39
  3. Appeler une fonction avec un tableau en parametre ?
    Par devoluti0n dans le forum C++
    Réponses: 9
    Dernier message: 11/04/2008, 16h21
  4. Appeler une fonction avec "action" ds un
    Par drinkmilk dans le forum ASP
    Réponses: 4
    Dernier message: 20/04/2004, 14h54
  5. Appeler une fonction avec/sans parenthèses
    Par haypo dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 29/12/2002, 18h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo