On Fri, 17 Jul 2020 at 12:28, Gustavo Carneiro <gjcarne...@gmail.com> wrote:

>
>
> On Fri, 17 Jul 2020 at 12:26, <emmanuel.coir...@caissedesdepots.fr> wrote:
>
>> Hello everyone,
>> (...)
>> But... looking at the examples, it wasn't very obvious that some
>> variables were catching variables and some others were matching ones.
>> I then read in details some rules about how to discover what is a
>> captured variable. But I'm not sure everybody will do this...
>>
>> Zen of Python tells us that "explicit is better than implicit". I know
>> this is not a rule written in the stone, but I think here, it applies
>> very well.
>>
>>
I Also  dislike the idea of undotted names being assigned, with not extra
visual clues,
and the scenario described by Emmanuel, in the other e-mail about
people changing variables when they think they are making a match
(essentially introducing the _same_ problem that `if (SPAM = 0):` had in C
which Python used to justify assignment not being an expression for over
20 years).

So, in adding to the bikeshed color possibilities, alongside
the "x=, y=" in this first e-mail or the "_ as x, _ as y" from Gustavo,
I present the possibility of making the Walrus mandatory for capture.
Maybe it is a bit "too much typing" - (Walrus will require 5-6 keystrokes
with the surrounding spaces), but I think the final look can be pleasantly
intuitive:

match my_point:
    case (x := _, y := _) | Point2d(x := _, y := _):
           return Point3d(x, y, 0)




> Guido said :
>> > We’re really looking
>> > for a solution that tells you when you’re looking at an individual
>> > case which variables are captured and which are used for
>> > load-and-compare.
>> >
>> > Marking up the capture variables with some sigil (e.g. $x or
>> > x?)
>> > or other markup (e.g. backticks or <x>) makes this common case ugly
>> > and inconsistent: it’s unpleasant to see for example
>> >
>> >     case %x, %y:
>> >         print(x, y)
>>
>> Guido talk about a "sigil", which seems to be a meaningless mark only
>> here to help the parser understand what the dev was writing.
>>
>> I propose that this "sigil" be the affectation mark : "=". Look :
>>
>>     z = 42
>>     match pt:
>>         case x=, y=, z:
>>             print(x, y, "z == 42")
>>
> (...)
 Gustavo Carneiro <gjcarne...@gmail.com> wrote:

> I kind of agree it is nicer to be more explicit.  But somehow x= looks
> ugly. It occurred to me (and, again, apologies if already been mentioned),
> we might use the `as` keyword here.
>
> The example above would become:
>
>     def make_point_3d(pt):
>         match pt:
>             case (as x, as y):
>                 return Point3d(x, y, 0)
>             case (as x, as y, as z):
>                 return Point3d(x, y, z)
>             case Point2d(as x, as y):
>                 return Point3d(x, y, 0)
>             case Point3d(_, _, _):
>                 return pt
>             case _:
>                 raise TypeError("not a point we support")
>
> If having "as x" as a standalone expression without anything to the left
> of "as" causes confusion, we could instead mandate the use of _ thus:
>
>             case (_ as x, _ as y):
>                 return Point3d(x, y, 0)
>
_______________________________________________
Python-Dev mailing list -- python-dev@python.org
To unsubscribe send an email to python-dev-le...@python.org
https://mail.python.org/mailman3/lists/python-dev.python.org/
Message archived at 
https://mail.python.org/archives/list/python-dev@python.org/message/EZGTHXOYTHRQ6JCEP7B26IA5RVGHEZAC/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to