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 :

Pre/Post routine à la sauce python (et non C++)


Sujet :

Python

  1. #1
    Membre confirmé Avatar de sopsag
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 224
    Par défaut Pre/Post routine à la sauce python (et non C++)
    J'ai une fonction F qui fait des tas de trucs et avec plein de return (= plusieurs points de sortie).

    Ce que j'aimerais obtenir :
    une pre-routine qui s'exécute en entrée de ma fonction F et une post-routine qui s'exécute au automatiquement moment ou je sors de F (par n'importe lequel des return).
    Avec bien sûr des variables partagées entre ces 2 routines.

    La solution que j'ai trouvée :
    Je déclare une classe C avec ma pre-routine dans le __init__ et ma post-routine dans le __del__.
    --> au début de F je déclare une instance k de C et le tour est joué : l'instance est détruite automatiquement au moment où je sors de la fonction et ma post-routine est bien exécutée au bon moment sans avoir à l'appeler explicitement.

    Ce qui ne va pas avec ma solution :
    1 - j'ai un warning parce k n'est utilisée nulle part dans le corps de F (c'est ce qui me gène le plus) .
    2 - je ne suis pas sûr que le garbage collector (ou équivalent) ne détruise pas k avant la sortie de F. (en fait, ça me gène encore plus)
    3 - ma solution ressemble furieusement à ce qu'on fait en pareil cas en C++ avec la pre-routine dans le constructeur et la post-routine dans le destructeur d'une classe dédiée (bé oui, c'est mon autre langage préféré...).

    Si quelqu'un connait une solution plus "pythonesque" pour obtenir le même résultat, je suis preneur.
    Je pense qu'il y a quelque chose avec les décorateurs mais je n'ai pas encore trouvé...

    Merci d'avance.

  2. #2
    Membre chevronné
    Profil pro
    Ingénieur sécurité
    Inscrit en
    Février 2007
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 574
    Par défaut
    Salut,
    Si tu as la main sur la fonctio,; tu fais un return global si tu peux, et tu mets ton bloc de post traitment dans un finaly, en fin de fonction.
    Sinon, tu décores ta fonction, comme tu l'as dit. C'est un cas où cela semble se justifier.

  3. #3
    Membre Expert Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Par défaut
    je crois que tu trouveras ton bonheur sur le wiki python

  4. #4
    Membre confirmé Avatar de sopsag
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 224
    Par défaut
    La piste c'est bien les décorateurs !
    J'ai un truc qui marche au poil, en pur python et sans warning.

    Mais maintenant, pour que mon machin soit encore plus beau, j'aimerais que la fonction qui me sert de décorateur soit une méthode de ma classe décorée...

    Je m'en vais créer un autre thread sur la question...

    Merci

  5. #5
    Membre émérite
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Par défaut
    Le seul moyen de s'assurer qu'un bout de code sera exécuté quoi qu'il arrive après ladite fonction, c'est le try/finally. En cas de raise, le « post traitement » de ta fonction ne sera pas exécuté... à moins bien sur que ton décorateur ne contienne un try/finally.

    Si ce traitement ne concerne qu'une et une seule méthode, peut-être ceci te conviendrait bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class MaClasse(object):
        def maFonctionTraitee(self, *args):
            faireQuelqueChose()
     
        def monTraitement(self, *args):
            preTraitement()
            try:
                self.maFonctionTraitee(*args)
            finally:
                postTraitement()
    Ou encore, si tu travailles avec des versions récentes de Python, il y a la piste du with.

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

Discussions similaires

  1. REGEX-Repérer des chaînes simples à la sauce Python
    Par rambc dans le forum Général Python
    Réponses: 5
    Dernier message: 12/01/2012, 10h16
  2. POST appel méthode fichier python
    Par jojo_ol76 dans le forum Android
    Réponses: 10
    Dernier message: 28/10/2011, 22h08
  3. Traitement PRE - POST requete
    Par fabszn dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 16/12/2009, 23h14
  4. [Mod Python] javascript non reconnu?
    Par Gorgo13 dans le forum Réseau/Web
    Réponses: 3
    Dernier message: 25/10/2007, 17h56
  5. javadoc @pre @post
    Par koolway dans le forum Langage
    Réponses: 3
    Dernier message: 30/09/2006, 12h35

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