Code generator and visitor pattern

Thomas Jollans thomas at jollans.com
Thu Jul 15 15:07:10 EDT 2010


On 07/15/2010 08:45 PM, Karsten Wutzke wrote:
> On 15 Jul., 20:28, Thomas Jollans <tho... at jollans.com> wrote:
>> On 07/15/2010 07:58 PM, Karsten Wutzke wrote:
>>
>>> Hello,
>>
>>> this is obviously a Python OO question:
>>
>>> Since Python isn't stringly typed,
>>
>> I expect this is an innocent typo, and you mean strictly.
>>
>>> single-dispatch isn't available per se. So is the "double-dispatch" Visitor pattern,
>>
> 
> Yes, typo, I meant strictly.
> 
>> Wait, what?
>> First of all, python is strictly typed in that every object has exactly
>> one type, which is different from other types. So you can't do "1"+2, as
>> you can in some other languages.
>>
>> Anyway, this is interesting: Tell me more about how Python's dynamic
>> nature makes it impossible to do whatever you're trying to do. I'm
>> baffled. What are you trying to do, anyway?
>>
>>> which is usually used
>>> in OO systems to implement code generators. So, what is the de facto
>>> method in Python to handle source code generation?
>>
>> WHOA! Now if that isn't a Gedankensprung. Also, I'm still very far from
>> your train of thought, apparently: Now, the thing that code generators
>> probably share is that they write code to files. It depends on what I'm
>> trying to do of course, but I expect there's a good chance that if I
>> wrote a code generator in Python, it wouldn't be particularly
>> object-oriented at all.
> 
> 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. I did some reading and it turned out that Python
> can't do it without some tricks (function decorators and 3rd party
> code).

Well, yes: the name of a function or method refers to a single callable
object and piece of code. if you care about the type of the argument,
you must say so explicitly:

class A:
    def dothing(self, obj):
        if isinstance(obj, str):
            self.dostringthing(obj)
        elif isinstance(obj, (int,float)):
            self.donumberthing(obj)
        else:
            self.dogenericthing(obj)

    # ...

while python doesn't have C++-style function overloading, its
alternative also doesn't have the limitations that come with it.



More information about the Python-list mailing list