If you look in PEP 622 you'll see that there was a rejected idea `if match ...` that's pretty similar. We nixed it because it just made the PEP larger. For 3.11 we can consider something like this.
On Fri, Oct 23, 2020 at 4:12 PM Valentin Berlier <berlie...@gmail.com> wrote: > Pattern-matching is great. I think PEP 634 is on the right track, but it > would be a waste to only use pattern-matching for choosing a branch in a > match statement. > > Let’s look at Rust: > > if let [x, y] = my_array { > ... > } > > Rust "if let" constructs are an alternative to full-blown match > statements that make it less verbose to match a single pattern. > > We have a similar problem. The syntax proposed by PEP 634 is pretty > verbose for matching a single pattern: > > match my_list: > case [x, y]: > ... > > Two keywords and two indentation levels. We can do better: > > if [x, y] := my_list: > ... > > Yes, your first intuition is right. This looks similar to the Rust > version but would work completely differently. But hear me out. Let's > look past my terrible example and focus on the idea. > > 1. The walrus operator was purposefully designed to create bindings and > not to perform assignments to arbitrary lvalues. > 2. Matching a pattern only introduces bindings as well, no assignments. > 3. The current behavior of the walrus operator is equivalent to matching > the right-side operand to an "irrefutable" capture pattern. > > Allowing the walrus operator to do pattern-matching would simply make > the returned value conditional. If the pattern doesn't match, the walrus > operator returns None. > > print(x := 42) # 42 > print(1 := 42) # None > > The current PEG parser would backtrack when encountering the walrus > operator to interpret the left-side as a pattern. > > Finally, more examples: > > # Buy every pizza on the menu > sum( > price for food in menu > if ({"type": "pizza", "price": price} := food) > ) > > # Download all images from document > {url: download(url) for tag in html if (Img(src=url) := tag)} > > # Monitor service health > while Response(status=200, json={"stats": stats}) := health_check(): > print(stats) > time.sleep(5) > > I'm convinced that making the walrus operator a pattern-matching > operator would turn it into the perfect companion for PEP 634. What do > you think? > > References: > > - PEP 634: https://www.python.org/dev/peps/pep-0634/ > - Rust "if let": https://doc.rust-lang.org/book/ch06-03-if-let.html > > -- > Valentin > _______________________________________________ > Python-ideas mailing list -- python-ideas@python.org > To unsubscribe send an email to python-ideas-le...@python.org > https://mail.python.org/mailman3/lists/python-ideas.python.org/ > Message archived at > https://mail.python.org/archives/list/python-ideas@python.org/message/MJ7JHYKHKB2T4SCFV4TX4IMKUANUAF5B/ > Code of Conduct: http://python.org/psf/codeofconduct/ > -- --Guido van Rossum (python.org/~guido) *Pronouns: he/him **(why is my pronoun here?)* <http://feministing.com/2015/02/03/how-using-they-as-a-singular-pronoun-can-change-the-world/>
_______________________________________________ Python-ideas mailing list -- python-ideas@python.org To unsubscribe send an email to python-ideas-le...@python.org https://mail.python.org/mailman3/lists/python-ideas.python.org/ Message archived at https://mail.python.org/archives/list/python-ideas@python.org/message/PVUQCU5722JVQC773OOEJ7I7FK3SFSS2/ Code of Conduct: http://python.org/psf/codeofconduct/