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 :

récupérer le nom d'une méthode


Sujet :

Python

  1. #1
    Membre averti Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Points : 407
    Points
    407
    Par défaut récupérer le nom d'une méthode
    Bonjour,
    je voudrais faire le print de la méthode dans laquelle je me trouve, exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def MaMethod(self):
       print "Methode invoquée :",???
     
    Le résultat attendu lors de l'exécution est :
    Methode invoquée : MaMethod
    Est ce possible ?
    Merci

  2. #2
    Membre éclairé
    Avatar de panda31
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2003
    Messages
    670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2003
    Messages : 670
    Points : 848
    Points
    848
    Par défaut
    Bonjour

    Apprendre l'introspection : http://python.developpez.com/cours/D...tion/index.php

    Petit exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    def myMethod(func):
       print "Methode en argument : " + func.__name__
    L'appel :
    donne :
    Methode en argument : myMethod

  3. #3
    Membre éclairé
    Avatar de panda31
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2003
    Messages
    670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2003
    Messages : 670
    Points : 848
    Points
    848
    Par défaut
    Effectivement...
    Pour trouver le nom de la méthode dans laquelle tu passes donc ?

    Peux-tu détailler ce que tu veux faire stp ?

    J'ai une petite idée mais à voir dans ton contexte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class MyClass:
    	def myMethod(self):
    		print "Methode invoquée :", self.myMethod.__name__
     
     
    mc = myClass()
    mc.myMethod()

  4. #4
    Membre averti Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Points : 407
    Points
    407
    Par défaut
    En fait, je souhaite une ligne générique qui puisse être copier/coller dans n'importe quelle méthode. Une sorte d'équivalent du "print self" pour la classe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class MyClass:
       def MyMethod():
          print "Ma Class : ",self
    Ma Class : <HMI.page.Page__>
    cela me donne la classe dans laquelle s'est fait le print : Page__
    Je voudrais le nom de la methode sans l'écrire explicitement dans le print.
    Dans ta proposition, autant faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print "Methode invoquée :myMethod"
    Merci
    Citation Envoyé par panda31 Voir le message
    Effectivement...
    Pour trouver le nom de la méthode dans laquelle tu passes donc ?

    Peux-tu détailler ce que tu veux faire stp ?

    J'ai une petite idée mais à voir dans ton contexte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class MyClass:
    	def myMethod(self):
    		print "Methode invoquée :", self.myMethod.__name__
     
     
    mc = myClass()
    mc.myMethod()

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 296
    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 296
    Points : 36 793
    Points
    36 793
    Par défaut
    Salut,

    Je ne pense pas qu'on sache récupérer cette information en dehors de la pile/stack en cours d'exécution.
    Avec inspect, çà donne une horreur du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    import inspect
     
    def current_function():
        return inspect.stack()[1][3]
    Utilisable ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class A:
        def __init__(self):
            print current_function()
        def myMethod(self):
            print current_function()
    - W

  6. #6
    Membre expérimenté 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 : 59
    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
    Points : 1 481
    Points
    1 481
    Par défaut
    Pourquoi ne pas faire faire le boulot par un décorateur ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    >>> def methode_verbeuse(methode):
    ...     def enrobage(*args,**kwargs):
    ...             print "methode %s invoquee" % (methode.__name__)
    ...             return methode(*args,**kwargs)
    ...     return enrobage
    ... 
    >>> 
    >>> class MaClasse(object):
    ...     def silencieuse(self):
    ...             print "code methode silencieuse"
    ...     @methode_verbeuse
    ...     def verbeuse(self):
    ...             print "code methode verbeuse"
    ... 
    >>> 
    >>> obj = MaClasse()
    >>> 
    >>> obj.silencieuse()
    code methode silencieuse
    >>> 
    >>> obj.verbeuse()
    methode verbeuse invoquee
    code methode verbeuse

  7. #7
    Membre éclairé
    Avatar de panda31
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2003
    Messages
    670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2003
    Messages : 670
    Points : 848
    Points
    848
    Par défaut
    Je n'y ai jamais trop touché, mais c'est beau! Simple et beau. Merci plxpy d'avoir éclairé ma lanterne.

  8. #8
    Membre expérimenté 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 : 59
    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
    Points : 1 481
    Points
    1 481
    Par défaut
    ... mais c'est beau! Simple et beau.
    C'est Python !

  9. #9
    Membre éclairé
    Avatar de panda31
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2003
    Messages
    670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2003
    Messages : 670
    Points : 848
    Points
    848
    Par défaut
    Comme tu dis!

    En revanche, j'ai testé rapidement en créant un décorateur qui permet ou non l'exécution d'une méthode. Je n'arrive pas à l'exécuter à cause d'un message d'erreur :
    C:\Documents and Settings\mmary\Bureau>python deco.py
    myAssert
    Traceback (most recent call last):
    File "deco.py", line 19, in <module>
    @enable(False)
    TypeError: 'NoneType' object is not callable
    Je suis en python 2.7.1.
    Mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    # -*- coding: utf-8 -*-
     
    def enable(condition):
    	print "ENABLE"
    	def decorated(func):
    		print "DECORATED"
                    @functools.wraps(func) 
    		def wrapper(*args, **kwargs):
    			print "WRAPPER"
    			#pré-traitement
    			if ( condition == True ):
    				#traitement
    				return func(*args, **kwargs)
    			else : 
    				print "Disabled"
    			return wrapper
    		return decorated
     
    @enable(False)
    def myFunction(*args, **kwargs):
    	print "Arguments de myFunction : %s" % ( ', '.join(args) )
     
    if __name__ == "__main__":
    	myFunction("A", "B", "C", "D")
    J'attends à obtenir le message Disabled, mais ça plante dès l'interprétation du tag de décoration @enable(False). Une idée ?

    CODE ÉDITÉ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    # -*- coding: utf-8 -*-
    import functools
     
    def enable(condition):
    	#print "ENABLE"
     
    	def decorated(func):
    		#print "DECORATED"
     
                    @functools.wraps(func) 
    		def wrapper(*args, **kwargs):
    			#print "WRAPPER"
    			#pré-traitement
    			if ( condition == True ):
    				#traitement
    				return func(*args, **kwargs)
    			else : 
    				print u"'%s' is disabled" % ( func.__name__ )
    		return wrapper
    	return decorated
     
    @enable(False)
    def myFunction(*args, **kwargs):
    	print "Arguments de myFunction : %s" % ( ', '.join(args) )
     
    @enable(True)
    def myFunction2(*args, **kwargs):
    	print "Arguments de myFunction : %s" % ( ', '.join(args) )
    if __name__ == "__main__":
    	myFunction("A", "B", "C", "D")
    	myFunction2("E", "F", "G", "H")

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Points : 822
    Points
    822
    Par défaut
    Hello,

    Tes lignes 16 et 17 sont indentées une fois de trop.

  11. #11
    Membre éclairé
    Avatar de panda31
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2003
    Messages
    670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2003
    Messages : 670
    Points : 848
    Points
    848
    Par défaut
    Merci beaucoup. J'ai mis à jour mon script et ça marche maintenant. J'essaie de trouver des best practices sur le sujet et des use cases intelligents. Je pense que je vais mettre à jour mon framework maison avec ces joujous!

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 25
    Points : 30
    Points
    30
    Par défaut
    ton probleme viens du faite qu'un decorateur doit retourner uen fonction qui elle se substituera a ta fonction d'origine :
    dans ton exemple, dans ta fonction qui decore (cad la fonction 'enable') , tu declare une nouvelle fonction. mais tu ne la retourne pas !! .en faite, 'enable' doit retourner une fonction appelable qui sera substitué a ta fonction decoré.

    ton code devien donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    def enable(condition):
        print( "ENABLE")
        def decorated(func):
            print( "DECORATED")
            def wrapper(*args, **kwargs):
                print( "WRAPPER")
                #pré-traitement
                if ( condition == True ):
                    #traitement
                    return func(*args, **kwargs)
                else :
                    print( "Disabled")
            return wrapper
        return decorated
     
    @enable(False)
    def myFunction(*args, **kwargs):
        print ("Arguments de myFunction : %s" % ( ', '.join(args) ))

    en faite, tu a decalé tes return . ta fonction enable retournais ... la fonction enable ^^

    j'en ai profité pour le rendre compatible python 3 (ajout de () pour l'appel de print )
    et j'ai retiré le "@functools.wraps(func)" qui me semblais inutile.

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Points : 822
    Points
    822
    Par défaut
    @panda :

    Un exemple d'utilisation des décorateurs, le pattern singleton :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    def singleton(cls):
        instances = {}
        def init(*a, **k):
            if cls not in instances:
                instances[cls] = cls(*a, **k)
            return instances[cls]
        return init
     
    @singleton
    class A:
        def __init__(self, x):
            self.x = x
     
    #creation de deux object differents ?
    a = A(5)
    b = A(10)
    # verification
    print a.x
    print b.x
    # bigre !
    # confirmation
    b.x = 10
    print a.x
    # c'est donc bien un singleton
    Sinon, pour voir un peu plus, tu peux jeter un oeil sur le framework pyramid qui en use et en abuse (et qui est cool !)

  14. #14
    Membre averti Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Points : 407
    Points
    407
    Par défaut
    Merci à tous de votre collaboration

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Récupérer le nom d'une classe et d'une méthode
    Par hanubis37 dans le forum Langages
    Réponses: 2
    Dernier message: 21/11/2014, 11h50
  2. Récupérer le nom d'une méthode
    Par artmicro dans le forum Langage
    Réponses: 8
    Dernier message: 30/06/2011, 11h12
  3. [javascript]Récupérer le nom d'une image
    Par LE NEINDRE dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 18/10/2005, 13h56
  4. [Debutant] Récupérer le nom d'une image
    Par Djoul dans le forum Débuter
    Réponses: 4
    Dernier message: 30/05/2005, 09h52
  5. Récupérer le nom d'une base
    Par nic_moq dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 24/03/2004, 10h50

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