[Cython] Visitor patterns and Python 2.4

William Stein wstein at gmail.com
Wed May 7 08:42:23 CEST 2008


On Tue, May 6, 2008 at 11:30 PM, Dag Sverre Seljebotn
<dagss at student.matnat.uio.no> wrote:
>
>  > We ship our own Python (2.5.2) with Sage, but I would rather stick
>  > with 2.3 compatibility. You might not consider it "important" but my
>  > computer (OS X 10.4, yet I know 10.5 is out but I haven't found the
>  > time to upgrade yet) has 2.3 by default, as did OS X 10.3.
>  >
>  It is certainly an argument I didn't consider.
>
>  Still... Python 2.4 was released 3 1/2 years ago, and I think Cython
>  users are going to be power users who will know how to upgrade their Python.
>
>
>  > I very much dislike using __class__.__name__ to decide what functions
>  > to call, but it doesn't look like you need decorators to get around
>  > this, do you?
>  >
>  Not having decorators makes the overhead of not using the function name
>  much greater. I.e. compare:
>
>  class MyVisitor(VisitorTransform):
>     @pre(cls=FuncDefNode)
>     def create_function_scope(self, node):
>         ...
>
>  (or similar) with something like (changing the match function slightly)
>
>  class MyVisitor(VisitorTransform):
>     def create_function_scope(self, node):
>         ...
>     create_function_scope = pre(cls=FuncDefNode, create_function_scope)
>
>
>  The latter one is so heavy to write that I'd rather want to simply do
>
>  class MyVisitor(VisitorTransform):
>
>     def pre_FuncDefNode(self, node):
>          ....
>
>  however I don't think this is as nice. Yes, I know, it is the standard
>  visitor pattern, but I think that pattern is the way it is because it is
>  made for less powerful languages than Python; using a real class
>  references seems better than having (using __name__ or using a
>  convention or in some way add extra, additional information to care about).
>
>  Also using decorator opens the way for other types of matches (though I
>  won't propose a full XPath match again, perhaps simple "attr" matching,
>  i.e. to which attribute and parent does the node belong to:
>
>  @pre(parent_cls=FuncDefNode, attr="body")
>  ...
>

Two comments:

(1) I personally think Python 2.3 is pretty old at this point, and we
shouldn't worry
too much about supporting it.  I.e., I buy your "Cython users are power
users" argument.

(2) If you use decorators then you'll have to implement them in Cython
so that compiling Cython itself using Cython will work.   That seems
like good motivation.

 -- William


More information about the Cython-dev mailing list