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 :

Pattern Visitor en python


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8
    Par défaut Pattern Visitor en python
    Bonjour a tous,

    Je cherche à implementer un "visitor" pour parcourir mon A.S.T. (arbre)
    Le concept même de ce design pattern ne m'est pas étrangé mais c'est son implementation en python qui me pose problème.
    Je n'arrive pas à envisager de solution pour palier à l'absence de la gestion de l'overloading dans les méthodes de classes python. (dans l'optique de reproduire la technique d'implémentation du c++)

    Quelqu'un aurait-il de la littérature (online) à me conseiler ? Ou peut être juste un bout de code à ma montrer ?

    Merci d'avance et bonne journée !

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8
    Par défaut
    Voici une solution que j'ai pu trouver :

    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
     
    class Ast:
      def accept(self, visitor):
        #on recupere le nom de la classe  specialisee de l'AST
        className = self.__class__.__name__
        #on va chopper la methode du visitor qui se nomme visit_<className>
        func = gettattr(visitor, 'visit_' + className)
        #on appel la dite methode avec le noeud de l'ast courrant en parametre
        return func(self)
     
     
    class DefaultVisitor():
      def visit(self, node):
        node.accept(self)
     
      #Va etre automatiquement appele sur les instance de classe OpExp
      def visit_OpExp():
         ...
     
      #Va etre automatiquement appele sur les instance de classe AssignExp
      def visit_AssignExp():
         ...
     
      etc
     
    visitor = DefaultVisitor()
    #et zou ! c'est parti mon kiki
    visitor.visit(ast_root)
    Bon voila, ca marche mais je me demandais s'il n'avait pas une methode plus propre/pratique pour faire cela.
    Quelqu'un a quelque chose a me proposer ?

    Merci d'avance.

  3. #3
    Membre émérite
    Avatar de GnuVince
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2004
    Messages
    679
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2004
    Messages : 679
    Par défaut
    Sachant que Python a des fonctions de premier ordre, ça serait pas plus simple d'utiliser ça?

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8
    Par défaut
    Qu'est ce qu'une fonction de premier ordre ?

  5. #5
    Membre émérite
    Avatar de GnuVince
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2004
    Messages
    679
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2004
    Messages : 679
    Par défaut
    En Python, tu peux passer une fonction comme paramètre à une autre fonction.

    Exemple:

    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
     
    def walk_tree(tree, init, proc):
        if tree == []:
            return init
        if isinstance(tree[0], list):
            return proc(walk_tree(tree[0], init, proc),
                        walk_tree(tree[1:], init, proc))
        else:
            return proc(tree[0], walk_tree(tree[1:], init, proc))
     
    def sum_tree(tree):
        return walk_tree(tree, 0, lambda a, b: a + b)
     
    def concat_tree(tree):
        return walk_tree(tree, '', lambda a, b: str(a) + str(b))
     
    tree = [1, [2, [3, [4, 5]]]]
     
    print sum_tree(tree)
    print concat_tree(tree)

Discussions similaires

  1. Design Pattern Visitor et Decorateur
    Par deubelte dans le forum C++
    Réponses: 8
    Dernier message: 20/05/2010, 18h05
  2. Design pattern Visitor & double dispatching
    Par f56bre dans le forum Langage
    Réponses: 5
    Dernier message: 24/03/2010, 11h22
  3. [Visiteur] Pattern Visitor et recherche multi critere
    Par Loizo dans le forum Design Patterns
    Réponses: 1
    Dernier message: 13/01/2009, 15h37
  4. [GOF] quel design pattern: Visitor, Strategy ou commande???
    Par smartCoder dans le forum Design Patterns
    Réponses: 4
    Dernier message: 15/01/2008, 14h10
  5. [Curiosité] design pattern visitor et compilation
    Par krokmitaine dans le forum C++
    Réponses: 6
    Dernier message: 10/11/2006, 15h06

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