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 :

Liste des fonctions imbriquées appelantes


Sujet :

Python

  1. #1
    Nouveau membre du Club Avatar de dca_marshall
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    46
    Détails du profil
    Informations personnelles :
    Âge : 62
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 46
    Points : 37
    Points
    37
    Par défaut Liste des fonctions imbriquées appelantes
    Bonjour,

    Je débute en python (3.7) et je cherche une moyen qui pourrait me ramener la liste des fonctions imbriquées.
    Ca m'est nécessaire pour le debuging et connaître le contexte d'appel de chaque fonction.

    J'ai bien trouvé quelques approches de solutions, avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    inspect.stack()
    inspect.currentframe()
    sys._getframe()
    mais rien qui donne le "chemin" d'appels complet

    En Perl il y a caller() qui fait bien le job.

    Voici un petit exemple, avec le résultat attendu:
    module f1.py
    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
    form f2 import f2
     
    def _internalF1():
       currentCall = # Un truc ici pour récupérer le chemin complet des appels
       print(f"Caller path: {currentCall}")
       f2()
       return True 
     
    def f1():
       currentCall = # Un truc ici pour récupérer le chemin complet des appels
       print(f"Caller path: {currentCall}")
       _internalF1()
       return True
     
    f1()
    module f2.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    def _internalF2():
       currentCall = # Un truc ici pour récupérer le chemin complet des appels
       print(f"Caller path: {currentCall}")
       return True 
     
    def f2():
       currentCall = # Un truc ici pour récupérer le chemin complet des appels
       print(f"Caller path: {currentCall}")
       _internalF2()
       return True
    Et du coup je verrai bien un résultat dans cet esprit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Caller path: f1
    Caller path: f1/_internalF1
    Caller path: f1/_internalF1/f2
    Caller path: f1/_internalF1/f2/_internalF2
    Dans la big picture, il est à noter que, le chargement des modules est totalement dynamique et que je ne sais jamais dans quel ordre les fonctions seront appelées et par quelle autre.
    D'ou le fait d'avoir un nom de fonction (externe), égal à son nom de module et que les sous fonctions internes, commence toujours par un "_".
    Tout ceci me facilitant la maintenance.

    Merci d'avance de votre aide

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

    Ecrit sur un coin de table:

    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
    import sys
     
    def caller():
        f = sys._getframe(1)
        names = []
        while f:
            x, m = f.f_code.co_name, f.f_globals['__name__']
            names += [x, m]
            f = f.f_back
        return '/'.join(names[:-2])
     
    def foo():
        print(caller())
     
     
    def bar():
        foo()
     
     
    foo()
    bar()
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Nouveau membre du Club Avatar de dca_marshall
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    46
    Détails du profil
    Informations personnelles :
    Âge : 62
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 46
    Points : 37
    Points
    37
    Par défaut
    Ha bah voilà !
    Je le savais que je m'adressais au haut de la pile...

    C'est exactement ce dont j'avais besoin (Perl like).
    C'est juste SUPER

    Comme cette petite fonction est intégrée dans un module d'écriture de message, j'ai juste démarré le sys._getframe() à 2 (au lieu de 1).
    Comme cela je ne vois pas la fonction de message.
    Et puis, j'ai mis dans l'orde souhaité, le "chemin" avec reversed.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    def caller():
        f = sys._getframe(2)
        names = []
        while f:
            x, m = f.f_code.co_name, f.f_globals['__name__']
            names += [x, m]
            f = f.f_back
        return '/'.join(reversed(names[:-2]))
    C'est vraiment PARFAIT, ça ramène bien les espaces de noms des modules.
    Je verrai à l'usure, si j'ai réellement besoin des noms de modules (car ça devient un peu long).

    Merci infiniment wiztricks (ou plutôt Maître wiztricks).

    <<Un débutant heureux>>

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

Discussions similaires

  1. [XSL] liste des fonctions
    Par pmartin8 dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 23/12/2005, 17h24
  2. tutoriel ou liste des fonctions pour GLADE
    Par debutanteVB.NET dans le forum GTK+ avec C & C++
    Réponses: 2
    Dernier message: 23/11/2005, 16h08
  3. Listes des fonctions mathématiques
    Par boulette18 dans le forum MFC
    Réponses: 1
    Dernier message: 28/09/2005, 06h38
  4. Réponses: 2
    Dernier message: 04/08/2005, 11h16
  5. Liste des fonctions
    Par Mookie dans le forum C
    Réponses: 2
    Dernier message: 22/09/2003, 16h42

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