# [Python-ideas] Match statement brainstorm

Stephen J. Turnbull stephen at xemacs.org
Fri May 27 03:20:33 EDT 2016

```Greg Ewing writes:

> Trying to come up with some real-looking examples:
>
>     switch obj:
>        case Point(?x, ?y):
>           print("Point at", x, y)
>        case Line(start = ?p1, end = ?p2, width = ?w):
>           print("Line from", p1, "to", p2, "with width", w)
>        case Intersection(?obj1, ?obj2):
>           print("Intersection of", obj1, "and", obj2)

Suppose I want to destructure the Points determining the Lines
determining an Intersection when I print an Intersection, say:

print("""Intersection of
Line from ({1},{2}) to ({3},{4}) with width {5} and
Line from ({6},{7}) to ({8},{9}) with width {10}
""".format(obj.obj1.p1.x, obj.obj1.p1.y,
obj.obj1.p2.x, obj.obj1.p2.y,
obj.obj1.w,
obj.obj2.p1.x, obj.obj2.p1.y,
obj.obj2.p2.x, obj.obj2.p2.y,
obj.obj2.w))

What would the full destructuring bind of an Intersection look like?
(I recognize that in your use case, obj1 might be a Circle.  Let's not
worry about that yet, unless it's easy.  I also recognize that most
likely you intended this routine to be called recursively, but let's
assume that isn't so: it is the nested case where I would really like
destructuring.  If it must be done recursively, I wouldn't care if I
had to write code like that below.)

If I can't do that, I won't really get too upset about using

if isinstance(obj, Point):
print("Point at", obj.x, obj.y)
elif isinstance(obj, Line):
print("Line from", obj.p1, "to", obj.p2, "with width", obj.w)
elif isinstance(obj, Intersection):
print("Intersection of", obj.obj1, "and", obj.obj2)

instead of the switch ... case syntax.

```