[Python-ideas] ML Style Pattern Matching for Python
Bruce Leban
bruce at leapyear.org
Sat Dec 18 22:26:05 CET 2010
On 12/17/2010 6:21 PM, Eike Welk wrote:
>
>> After learning a bit of Ocaml I started to like its pattern matching
>> features.
>> Since then I want to have a "match" statement in Python. I wonder if
>> anybody
>> else would like this too.
>
>
On Fri, Dec 17, 2010 at 4:14 PM, Terry Reedy <tjreedy at udel.edu> wrote:
> 1. completely redundant with respect to current Python syntax;
> 2. look like chicken scratches;
> 3. limited by the chars availables to just a few of the infinity of tests
> one might want to run.
> 4. gives special prominence to tuples, which is hardly appropriate to list
> or iterable-oriented code.
>
>
I'm skeptical that anything is worth adding here, but here's an alternative.
I'm only looking at the decomposition part. I'm using a matches keyword and
"&" and "*". (The choice here doesn't matter but I have to use something for
the examples, so please don't pick on that aspect.)
x = (3, 4)
if x matches (&a, &b):
print(a, b)
is equivalent to
x = (3, 4)
if isinstance(x, tuple) and len(x) == 2:
a, b = x
print(a, b)
Or a bit more complicated:
x = [3, 4]
if x matches [3, &b, *]:
print(b)
is equivalent to
x = [3, 4]
if isinstance(x, list) and x[0] == 3:
_, b, *_ = x
print(b)
and
if x matches {j : &k}:
print(k)
means
if isinstance(x, dict) and j in x and len(x) == 1:
k = a[j]
print(k)
Here's a more complex example:
x matches {
'account': (&username, &domain),
'type': 'administrator',
'password': &hash,
'friends': (&best_friend, *&other_friends),
*
}
Whether or not this is useful at all is a big question, but I think it's at
least more interesting. This isn't perfect. For example
x matches Foo(a=&alpha, b=&beta)
could mean checking x.hasattr('a') but there's no guarantee that Foo(a=1,
b=2) will produce that result. Maybe that's OK.
Also, any values on the right hand side not marked by & are matched for
equality, so you could write
x matches (3 * 14 + big_complicated_expression, &y)
which is pretty ugly. And that suggests:
x matches (f(&y), g(&z))
which either doesn't make sense or is messy. We could add a __matches__
attribute to functions so they could support this, but now this is getting
pretty complicated for unclear benefit.
--- Bruce
Latest blog post: http://www.vroospeak.com/2010/11/enduring-joe-barton.html
Learn about security: http://j.mp/gruyere-security
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20101218/181a57b7/attachment.html>
More information about the Python-ideas
mailing list