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 :

fonctionnement de (*args,**kwds)


Sujet :

Python

  1. #1
    Membre confirmé
    Inscrit en
    Mars 2009
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 62
    Par défaut fonctionnement de (*args,**kwds)
    bonjour ,
    j'essaie de comprendre le fonctionnement d'un programme python et j'ai pas compris la classe suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class retourner:
     
        def __init__(self, object):
            self.object = object
     
        def __getattr__(self, name):
            def proxy(*args, **kwds): 
                getattr(self.object, name)(*args, **kwds)
                return self.object
            return proxy
    le ligne suivant me parait étrange, et j'ai rien saisi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    getattr(self.object, name)(*args, **kwds)
    voici un appel de la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Q=[] # Q est une liste d'objet
    ...
    return retourner(Q).sort()
    merci en avance de vos réponses et suggestions

  2. #2
    Membre éprouvé
    Inscrit en
    Avril 2010
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Avril 2010
    Messages : 99
    Par défaut
    dans la syntaxe:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    def proxy(*args, **kwds)
    args sera une liste contenant l'ensemble des valeurs données en argument et kwds sera un dictionnaire contenant les arguments donnés par mot-clé.

    Par exemple si tu appelles proxy de la manière suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    proxy( 1, "a", toto=2, titi="b")
    alors args prendra la valeur [1, "a"]
    et kwds prendra la valeur { "toto" : 2, "titi" : "b" }

    pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    getattr(self.object, name)(*args, **kwds)
    En fait, getattr(self.object, name) renvoie la méthode portant le nom name
    (le contenu de name plus précisément) de l'objet self.objet.
    Ensuite, cette méthode est appelée avec comme liste d'arguments principale args et comme arguments nommés kwd.

    Donc globalement, lorsque tu fais par exemple:

    Lorsque tu appelles une méthode sur l'objet b, l'objet b appelle la méthode portant le même nom et avec les mêmes arguments sur l'objet a.
    Donc b et a vont se comporter exactement de la même manière (du moins au niveau des appels de méthodes) et on aurait pu aussi bien faire

    L'avantage est que tu peux modifier le code de ta classe retourner pour ajouter des fonctionnalités.

    Par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class retourner:
         def __init__(self, object):
            self.object = object
     
        def __getattr__(self, name):
            def proxy(*args, **kwds): 
                print "la méthode %s a été appelée avec les arguments %s" % (name, args)
                getattr(self.object, name)(*args, **kwds)
                return self.object
            return proxy
    Ici, à chaque fois que tu appelleras une méthode sur l'objet b alors le nom de cette méthode ainsi que ses arguments seront écrits en sortie standard.

    En fait, cette classe est une implémentation du design pattern proxy.
    Tu devrais trouver pas mal de documentations dessus en utilisant Google.

  3. #3
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    Citation Envoyé par Biribibi Voir le message
    args sera une liste [...]
    un tuple

  4. #4
    Membre éprouvé
    Inscrit en
    Avril 2010
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Avril 2010
    Messages : 99
    Par défaut
    Oups, en effet, désolé

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Bonjour Biribibi,



    Intéressante réponse Biribibi; mais je voudrais te demander ce que tu entends dans cette phrase
    En fait, getattr(self.object, name) renvoie la méthode portant le nom name
    (le contenu de name plus précisément) de l'objet self.objet.
    par
    « contenu de name »


    Je subodore là dessous une notion de variable qui est erronée en Python. Es tu au courant qu'il n'existe pas de variables en Python ? Qu'entends tu par le terme de contenu ?

  6. #6
    Membre confirmé
    Inscrit en
    Mars 2009
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 62
    Par défaut fonctionnement de (*args,**kwds)
    un très grand merciiii pour votre réponse Biribibi
    et j'attends votre réponse sur la question de eyquem
    merci encore

  7. #7
    Membre éprouvé
    Inscrit en
    Avril 2010
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Avril 2010
    Messages : 99
    Par défaut
    Hmmm, je ne savais que les variables n'existaient pas en Python.

    Bon je pense que tout est question de vocabulaire.
    La notion de variable a peut-être une sémantique différente de celle d'autre langage mais elle existe quand même à ma connaissance.
    Pour moi, une variable, c'est une étiquette (une chaîne de caractères) pointant vers un objet.
    Il peut y avoir plusieurs étiquettes pointant vers le même objet contrairement à d'autres langages.
    Par exemple, si on fait a="toto". a est une variable et pointe vers l'objet "toto".
    Bon dans tous les cas, tous les ouvrages sur Python que je connaisse utilisent la notion de variable, même le Python Language Reference.
    http://docs.python.org/reference/


    Bon pour revenir à ce que je disais
    En fait, getattr(self.object, name) renvoie la méthode portant le nom name
    (le contenu de name plus précisément) de l'objet self.objet.
    Je me suis mal exprimé.
    Ce que je voulais dire c'est que name est un objet de type string et getattr(self.object, name) renvoie la méthode (ou l'attribut) portant comme nom le "contenu" de cette chaîne de caractères.
    Par exemple, getattr(obj, "toto") renverra l'attribut toto de l'objet obj.
    et si on fait
    alors gettattr(obj, toto) renverra l'attribut tata de l'objet obj.

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 790
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 790
    Par défaut
    Salut

    J'aime bien la construction fonctionnelle de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        def __getattr__(self, name):
            def proxy(*args, **kwds): 
                getattr(self.object, name)(*args, **kwds)
                return self.object
            return proxy
    Mais dans le cas de __getattr__ quel est son intérêt par rapport à une écriture plus courte telle que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        def __getattr__(self, name):
               return(self.object, name)
    I.e au qu'apporte la "closure" dans ce cas?
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Membre éprouvé
    Inscrit en
    Avril 2010
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Avril 2010
    Messages : 99
    Par défaut
    J'ai cherché un peu sur Google et j'ai retrouvé l'exemple du code donné.
    http://code.activestate.com/recipes/...st-methods-me/

    En gros chaque appel de méthode de l'objet proxy renverra l'objet lui même en plus d'appeler la méthode de la classe d'origine.

    Ca permet de faire par exemple des trucs du genre.

    l1 = retourner([]).append(1).append(2).append(3).sort()

Discussions similaires

  1. Réponses: 3
    Dernier message: 16/06/2003, 17h51
  2. Réponses: 5
    Dernier message: 14/05/2003, 15h51
  3. [Turbo Pascal] TP7 fonctionne en QWERTY
    Par callahan dans le forum Turbo Pascal
    Réponses: 9
    Dernier message: 08/02/2003, 22h49
  4. Prb de fonctionnement dans SaveDialog avecInitialDir
    Par boyerf dans le forum Composants VCL
    Réponses: 4
    Dernier message: 12/12/2002, 22h46
  5. ca ne fonctionne pas (generateur auto-incrémentant)
    Par tripper.dim dans le forum SQL
    Réponses: 7
    Dernier message: 26/11/2002, 01h10

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