[Python-Dev] Re: switch statement

Phillip J. Eby pje at telecommunity.com
Fri Apr 22 06:25:22 CEST 2005


At 06:10 PM 04/21/2005 +0100, Michael Hudson wrote:
>But the visitor pattern is pretty grim, really.  It would be nice (tm)
>to have something like:
>
>   match node in:
>     Assign(lhs=Var(_), rhs=_):
>        # lhs, rhs bound in here
>     Assign(lhs=Subscr(_,_), rhs=_):
>        # ditto
>     Assign(lhs=Slice(*_), rhs=_):
>        # ditto
>     Assign(lhs=_, rhs=_):
>        raise SyntaxError
>
>in Lib/compiler.

FWIW, I do intend to add this sort of thing to PyProtocols' predicate 
dispatch system.  Actually, I can dispatch on rules like the above now, 
it's just that you have to spell out the cases as e.g.:

     @do_it.when("isinstance(node, Assign) and isinstance(node.lhs, Subscr)")
     def do_subscript_assign(node, ...):
         ...

I'd like to create a syntax sugar for pattern matching though, that would 
let you 1) use a less verbose way of saying the same thing, and 2) let you 
bind the intermediate values to variables that then become accessible in 
the function body as locals.

Anyway, the main holdup on this is deciding what sort of Python syntax 
abuse should represent variable bindings.  :)  Maybe something like this 
will be suitably horrific:

    @do_it.when("node in Assign.match(lhs=`lhs` in Subscr,rhs=`rhs`)")
    def do_subscript_assign((lhs,rhs), node, ...):
        ...

But I think maybe here the cure is worse than the disease.  :)  Pushed this 
far, it seems to beg for new syntax to accommodate in-expression variable 
bindings, something like 'var:=value'.  Really, though, the problem is 
probably just that inline variable binding is downright unpythonic.  The 
only time Python does anything vaguely similar is with the 'except 
type,var:' syntax.



More information about the Python-Dev mailing list