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 :

tester si fonction avec return a été exécutée


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2007
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 103
    Par défaut tester si fonction avec return a été exécutée
    Developpeurs, Bonjour!

    J'aimerais savoir si une fonction a été exécutée ou pas et le cas échéant, récupérer les return en résultant :
    Python 3.2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    def test () :
        a = 10
        b = (20, 30)
        return ( a , b )
     
    class ClassTest :
        # j aimerais entrer dans la boucle if que si test a ete executee    
        if test :
            print ( "ok mais je ne sais pas si test a ete executee?" )
            print ( "comment recuperer les return de test ici -sans utiliser global ?" )
     
        else :
            print ( "no" )
    Merci pour toute info !

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

    A mon avis, on devrait pouvoir faire ça avec un décorateur écrit sous forme de classe.

    L'avantage de ce type de décorateur, c'est qu'il peut conserver des infos après chaque appel, par exemple sous forme de dictionnaire. On peut donc tester à n'importe quel endroit du code s'il y a eu un appel (dictionnaire non vide), et si oui, d'obtenir les résultats dans l'ordre où ils ont été obtenus. On peut aussi en même temps conserver les arguments passés à chaque appel.

    Et si ce décorateur était utilisé pour décorer plusieurs fonctions du code, il pourrait conserver dans une variable de classe tous les appels avec pour chaque appel le nom de la fonction appelée, les arguments et le résultat de l'appel, le tout dans l'ordre des appels. Bref, c'est très puissant.

    J'ai fait un tuto sur le sujet: http://python.jpvweb.com/mesrecettes...ateurs_modeles. Attention: c'est du Python 2.7.

    Essaie de faire, et reviens ici si tu n'y arrives pas.

    Tyrtamos

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

    +1 pour les décorateurs.

    Une autre idée est que la valeur par défaut d'un argument n'est évalué qu'une fois. A partir de là il est possible d'utiliser une liste en arguments pour stocker les résultats.
    Comprendre que comme cela on a les résultats dans l'ordre ou la fonction a été appelée ainsi que le nombre de fois (len de la liste).

    une combinaison avec un décorateur est intéressante non ?

    @+

    Edit: Pour ce qui est du titre une fonction fait toujours un return.

  4. #4
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Bonjour,

    Peut-être que avec des parenthèses à test cela irait un peu mieux:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    class ClassTest :
        # j aimerais entrer dans la boucle if que si test a ete executee    
        if test :
    Ici la condition est vraie parce que test existe dans l'espace de nom global, du moins dans l'exemple et n'est pas nul. Donc les deux print doivent s'exécuter à tous les coups. Mais test n'est pas appelée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    class ClassTest :
        # j aimerais entrer dans la boucle if que si test a ete executee    
        if test ():
    Comme ceci, test sera appelée, mais dans ton exemple, test renvoie toujours la même chose, on suppose qu'elle pourrait retourner False dans certains cas sinon c'est sans intérêt bien sûr.

  5. #5
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Je repense à python 3 et il m'est venu un doute, comme je l'utilise peu.

    Donc j'ai testé, et je confirme
    vincent@tiemoko:~/Bureau$ python test.py
    ok mais je ne sais pas si test a ete executee?
    comment recuperer les return de test ici -sans utiliser global ?
    vincent@tiemoko:~/Bureau$ python3 test.py
    ok mais je ne sais pas si test a ete executee?
    comment recuperer les return de test ici -sans utiliser global ?

  6. #6
    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
    Je ne vois pas l’intérêt de tester if test() ou alors je n'ai pas compris la question.
    De plus regarder dans les namespaces ne sert à rien (sans utiliser global ?) puisque a = test() / a = le return de test.

  7. #7
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Citation Envoyé par VinsS Voir le message
    vincent@tiemoko:~/Bureau$ python test.py
    ok mais je ne sais pas si test a ete executee?
    comment recuperer les return de test ici -sans utiliser global ?
    vincent@tiemoko:~/Bureau$ python3 test.py
    ok mais je ne sais pas si test a ete executee?
    comment recuperer les return de test ici -sans utiliser global ?
    J'explique, ceci est le test du code de base TEL QUEL avec python 2 et 3 et démontrait que

    if test:

    sera toujours vrai puisque test est un objet non nul.

    Mon explication était que pour vérifier le retour de 'def test' les parenthèses étaient indispensables et, ceci entendait bien sur que l'exemple donné avait été simplifié mais que 'def test()' aurait pu retourner autre chose que dans l'exemple bien sur

    Citation Envoyé par VinsS Voir le message
    ... mais dans ton exemple, test renvoie toujours la même chose, on suppose qu'elle pourrait retourner False dans certains cas sinon c'est sans intérêt bien sûr.
    Nous sommes bien d'accord que l'exemple donné est un code qui ne sert à rien

    Citation Envoyé par santaflam
    ... Je veux seulement récupérer les return dans le cas où elle aurait été exécutée.
    Santaflam, nous sommes bien d'accord que le return "s'adresse à quelqu'un en réponse à sa question", non ?

    Tu ne peux vérifier le contenu d'un return qu'en exécutant la fonction qui le génère. Les décorateurs dont on te parle, opportunément j'en conviens ne font pas autre chose q'appeler test() eux aussi.

    Autre solution, si ta fonction test était elle aussi dans une classe et ses données résultantes des attributs-arguments de cette classe, tu te simplifierais la vie.

  8. #8
    Membre confirmé
    Inscrit en
    Septembre 2007
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 103
    Par défaut
    Merci pour vos réponses!

    @VinsS: pas possible de faire if test(): car j'exécuterais la fonction dans ce cas. Je veux seulement récupérer les return dans le cas où elle aurait été exécutée. J avais mis if test : de manière générique, en sachant que ça ne teste pas si elle a été exécutée ou pas.

    La classe décorateur va certainement résoudre mon cas (faut que je potasse un peu, je débute). Et tester en Python 3.2, auquel je suis lié parce que c'est pour un script de l'appli graphique Blender. Je donnerai donc un feedback à cet égard.

    La fonction test fait des calculs et renvoie listes et dicos. La classe est une classe de UI dans laquelle j'affiche les résultats des return.

Discussions similaires

  1. Fonction avec getopts ne s'exécute qu'une seule fois
    Par yzoug dans le forum Shell et commandes GNU
    Réponses: 9
    Dernier message: 02/03/2015, 12h44
  2. Fonction avec return table
    Par Aethia dans le forum Sybase
    Réponses: 6
    Dernier message: 11/12/2013, 18h39
  3. Fonction avec un return
    Par baleiney dans le forum Langage
    Réponses: 2
    Dernier message: 03/01/2008, 23h27
  4. Exécution de deux fonction avec ie
    Par musicann dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 15/06/2007, 14h25
  5. Fonction avec divers return possibles
    Par inddzen dans le forum C++
    Réponses: 11
    Dernier message: 28/02/2007, 23h08

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