Code generator and visitor pattern

MRAB python at mrabarnett.plus.com
Thu Jul 15 15:33:47 EDT 2010


Stefan Behnel wrote:
> Karsten Wutzke, 15.07.2010 20:45:
>> Well, I'm most experienced in OO, so writing OO in Python seems like
>> the way to start with Python. The visitor pattern uses single-
>> dispatch, that is, it determines which method to call be the type of
>> object passed in.
> 
> Well, then do that. Put the types into a dict and map them to the 
> functions to call, then call the function through the dict. That's a 
> pretty common way to do dispatching.
> 
> 
>> Note, that I have an hierarchical object structure which I want to
>> iterate over, so using OO looked natural to me. If there's a better
>> approach, I'm all ears.
> 
> You speak in riddles, but my guess is that your problem is that you 
> don't want to dispatch mechanism to match only exact types but also 
> subtypes. No problem, just build your dict incrementally and add new 
> types as they come in. See this file for an example:
> 
> http://hg.cython.org/cython-devel/file/tip/Cython/Compiler/Visitor.py
> 
Another variation: the dispatch table starts with entries for certain
types then it adds subtypes on demand:

     def visit(self, obj):
         try:
             handler = self.dispatch_table[type(obj)]
         except KeyError:
             for disp_type, disp_func in self.dispatch_table.items():
                 if isinstance(obj, disp_type):
                     self.dispatch_table[type(obj)] = disp_func
                     handler = disp_func
             else:
                 raise RuntimeError("Visitor does not accept object: %s" 
% obj)
        return handler(obj)



More information about the Python-list mailing list