![](https://secure.gravatar.com/avatar/d67ab5d94c2fed8ab6b727b62dc1b213.jpg?s=120&d=mm&r=g)
On Sun, Jul 12, 2020 at 11:04 AM Guido van Rossum <guido@python.org> wrote:
On Sat, Jul 11, 2020 at 5:58 PM Chris Angelico <rosuav@gmail.com> wrote:
On Sun, Jul 12, 2020 at 10:30 AM Greg Ewing <greg.ewing@canterbury.ac.nz> wrote:
Just had another thought about marking assignment targets.
The PEP currently forbids repeating bound names in a pattern to avoid raising expectations that
case Point(x, x):
would match only if the two arguments were equal.
But if assignment targets were marked, we could write this as
case Point(?x, x):
and it would work as expected.
Hang on. Matching happens before assignment, so this should use the previous value of x for the matching. At least, that's my understanding. If you do something like:
case Point(x, 2):
it won't assign x unless the second coordinate is 2, right?
Good catch. That's actually undefined -- we want to let the optimizer have some leeway in how to generate the best code for matching. See https://www.python.org/dev/peps/pep-0622/#performance-considerations
Currently it doesn't optimize all that much -- it just processes patterns from left to right: ```
match Point(3, 3): ... case Point(x, 42): pass ... print(x) 3
Ah, okay. My "obvious" intuition was that this wouldn't assign, and Greg's equally "obvious" intuition was that it would. I think that disagreement should be a strike against the "Point(?x, x)" notation - I can't be the only person who would misinterpret it. ChrisA