[Python-ideas] Match statement brainstorm
Greg Ewing
greg.ewing at canterbury.ac.nz
Thu May 19 04:20:04 EDT 2016
Guido van Rossum wrote:
> def demo(arg):
> switch arg:
> case (x=p, y=q): print('x=', p, 'y=', q)
> case (a, b, *_): print('a=', a, 'b=', b)
> else: print('Too bad')
I would also add
case Point(x=p, y=q): print('Point: x=', p, 'y=', q)
Then if you also had
Vector = namedtuple('x,y,z')
then this case would match a Point but not a Vector.
However, there's a problem with all this if you want to
allow matching on specific values as well as structure.
Haskell allows you to say things like
myfunc [17, 42, x] = ...
which will only match a 3-element list whose first 2
elements are 17 and 42.
This would be fine in Python as long as the constants are
literals. But if you want to name the constants,
Seventeen = 17
FortyTwo = 42
case [Seventeen, FortyTwo, x]:
it becomes ambiguous. Are the identifiers values to be
matched or names to be bound?
If we want this feature, it seems like we will need to
explicitly mark either names to be bound or expressions to
be evaluated and matched against.
At first I thought maybe a name could be enclosed in parens
to force it to be treated as an expression:
case [(Seventeen), (FortyTwo), x]:
but that wouldn't quite be consistent with assignment
syntax, because (x) is actually valid on the left of an
assignment and is equivalent to just x.
>>>>demo(c)
>
> a= h b= o
>
> (Note the slightly unfortunate outcome for 'hola',
If you wanted the second case to only match the tuple,
you could write
case tuple(a, b, *_):
--
Greg
More information about the Python-ideas
mailing list