[Python-ideas] Match statement brainstorm
Michel Desmoulin
desmoulinmichel at gmail.com
Tue May 24 10:59:55 EDT 2016
What about making it a function ?
Pattern matching is complex, it can be like a mini language inside the
language, just like regex.
To match text we do:
import re
re.match('pattern', 'string')
We could do the same for matching structures:
from inspect import match
def do(stuff):
m = match(stuff): # m implements __call__
if m('whatever mini language you like'):
return foo
if m('again'):
return m.thing_your_extracted
Pros:
- no need for a new syntax
- very explicit
- use well know constructs
- we can easily start experimenting with the matching language in a lib
in Pypy
Cons:
- much more verbose;
- debugging your mini language and handling error is not as good;
Le 24/05/2016 16:35, Paul Moore a écrit :
> On 24 May 2016 at 14:31, Michael Selik <michael.selik at gmail.com> wrote:
>> On Tue, May 24, 2016 at 2:08 AM Greg Ewing <greg.ewing at canterbury.ac.nz>
>> wrote:
>>>
>>>> On Mon, May 23, 2016 at 7:57 PM, Michael Selik <michael.selik at gmail.com>
>>>> wrote:
>>>>
>>>>> def demo(arg):
>>>>> if p, q ?= arg.x, arg.y: # dict structure
>>>>> elif x ?= arg.x and isinstance(x, int) # assignment + guard
>>>>> elif a, b, *_ ?= arg: # tuple structure
>>>>> elif isinstance(arg, Mapping): # nothing new here
>>>
>>> I'm unenthusiastic about this -- the above looks like
>>> an unreadable mess to me.
>>
>>
>> Which is unreadable: ``if/elif`` keywords or ``?=`` operator? If it's the
>> latter, please don't get hung up on that, as I intended that as a
>> placeholder for whatever operator or keyword is best. My main point is that
>> switch/case/matching is semantically identical to if/elif, so why use
>> something different?
>
> For me, it's the use of operators (punctuation) plus the fact that the
> overall layout doesn't in any way imply to me "I'm looking at *this*
> expression. Let's try a sequence of matches..."
>
> The key distinguishing feature for me of a switch/match statement is
> that it organises the "flow" of the statement differently from
> if/elif. The if/elif chain says "try this, then that, now something
> else". There's no implication that the tests are all looking at the
> same subject - to spot that, you need to be able to see (from the
> layout of the tests) the actual subject item on each line, and the ?=
> operator syntax obscures that because "arg" is used differently in
> each test.
>
> With a switch statement, however, the subject is stated once, at the
> top of the statement. The checks are then listed one after the other,
> and they are all by definition checks against the subject expression.
> And in fact, for me that's the distinguishing feature of a switch
> statement - that it's a series of tests against a single implied
> subject. That's also (I suspect) why it's hard to come up with a good
> syntax for tests - Python doesn't really do "implied subjects"
> anywhere else (explicit is better than implicit and all that).
>
> IMO, "Series of tests against a single expression" is a common enough
> pattern to be worth exploring in spite of the fact that it runs
> counter to EIBTI. But you may need to be Dutch to understand why :-)
>
> Paul
> _______________________________________________
> Python-ideas mailing list
> Python-ideas at python.org
> https://mail.python.org/mailman/listinfo/python-ideas
> Code of Conduct: http://python.org/psf/codeofconduct/
>
More information about the Python-ideas
mailing list