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 :

Décorateur-Ajouter une variable à une fonction


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Par défaut Décorateur-Ajouter une variable à une fonction
    Bonjour.

    Dans le code suivant, j'aimerais que la méthode quiSuisJe connaisse son nom de façon "automatisée".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/usr/bin/env python3
     
    class Test():
        def __init__(self):
            self.oki = None
     
        def quiSuisJe(self):
            print('Quel est mon nom ?')
     
     
    a = Test()
    a.quiSuisJe()
    Une idée ?

    On pourrait faire appel à 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
    #!/usr/bin/env python3
     
    def unDecorateur(uneMethode):
        print(uneMethode.__name__)
     
        return uneMethode
     
    class Test():
        def __init__(self):
            self.oki = None
     
        @unDecorateur
        def quiSuisJe(self):
            print('????')
     
     
    a = Test()
    a.quiSuisJe()
    Dans ce cas, comment ajouter une variable à une fonction via un décorateur ?

  2. #2
    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
    Bonjour rambc,

    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
    import traceback
    import sys
     
    class Test():
        def __init__(self):
            self._name = traceback.extract_stack(limit=2)[0][3].split('=')[0].strip()
     
        def quiSuisJe(self):
            return self._name
     
        def quiSuisJe2(self):
            return sys._getframe().f_code.co_name
     
    a = Test()
    print(a.quiSuisJe())
    print(a.quiSuisJe2())
    @+

  3. #3
    Membre éprouvé

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Par défaut
    Bonjour PauseKawa.

    Merci pour le code (j'avais déjà vu cela quelque part mais je ne l'avais pas mis dans ma liste de recettes).

  4. #4
    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
    Citation Envoyé par rambc Voir le message
    (j'avais déjà vu cela quelque part mais je ne l'avais pas mis dans ma liste de recettes).
    A vrais dire on en a déjà parler et je sort cela de mon dossier 'This function should be used for internal and specialized purposes only'
    Dans le même dossier j'ai aussi l'option avec décorateur (dans l'esprit du lien donné) mais puisque sys._getframe() fait le boulot...

  5. #5
    Membre éprouvé

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Par défaut
    Citation Envoyé par PauseKawa Voir le message
    Dans le même dossier j'ai aussi l'option avec décorateur (dans l'esprit du lien donné) mais puisque sys._getframe() fait le boulot...
    Tu éveilles ma curiosité.

    Ta solution permet-elle de créer une "nouvelle" variable utilisable n'importe où dans la fonction décorée ?

  6. #6
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Par défaut
    Citation Envoyé par rambc Voir le message
    Tu éveilles ma curiosité.
    même chose pour moi mais la question est pour toi rambc

    quelle problématique te fait poser cette question (la question initiale j'entends) ?

  7. #7
    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
    Bonjour,

    Citation Envoyé par rambc Voir le message
    Tu éveilles ma curiosité.

    Ta solution permet-elle de créer une "nouvelle" variable utilisable n'importe où dans la fonction décorée ?
    A ce niveau (dossier 'This function should be used for internal and specialized purposes only') tout est possible avec sys (sys.setprofile etc. Voir le lien). La seule limitation c'est le read only du namespace local mais rien n’empêche de laisser l'information disponible pour celui ci (voir d'y injecter du code, à tester le week end prochain suivant le temps). La difficulté de l'__init__ et du nom de l'instance dans le lien donné c'est que rien n'est créer dans le namespace avant le return de l'__init__, ce n'est pas le cas d'une fonction autre.
    C'est des choses a explorer, pas a utiliser. sys._getframe() fait le travail tout aussi bien .

    @+

  8. #8
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Par défaut
    salut,

    ou en utilisant les décorateurs comme tu le suggérais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    def quiSuisJe(func):
        def _decorated(*args, **kwargs):
            print "function name: %s" % func.__name__
            return func(*args, **kwargs)
        return _decorated
     
    @quiSuisJe
    def hello(name):
        print "hello %s" % name
     
    hello("rambc")
    Produit le résultat suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    function name: hello
    hello rambc

  9. #9
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Par défaut
    ou encore plus simple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def quiSuisJe():
        print quiSuisJe.__name__

  10. #10
    Membre éprouvé

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Par défaut
    Bonjour kango.

    Le problème avec ton code, c'est que si je change le nom de la méthode, il faudra que je le fasse deux fois. Inconvénient que n'a pas le code de PauseKawa.

  11. #11
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Par défaut
    avec la deuxième approche oui, mais pas avec le décorateur

  12. #12
    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
    Au passage vous avez sur le forum comment faire un callback sur un __init__ avec un décorateur. Mais je ne vais pas donner le lien car il parait que wiztricks traîne sur le forum.

    @+

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 15/04/2014, 12h32
  2. [XL-2010] Attribuer une valeur à une variable en fonction d'une autre
    Par jkiii dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 13/11/2013, 19h17
  3. Réponses: 4
    Dernier message: 16/02/2006, 10h40
  4. changer et afficher une variable en fonction d'un select
    Par psychoBob dans le forum Général JavaScript
    Réponses: 30
    Dernier message: 22/11/2005, 08h15
  5. Ajouter du texte à une variable
    Par micatmidog dans le forum Langage
    Réponses: 2
    Dernier message: 28/09/2005, 19h09

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