classification
Title: Eliminate bindings for partial pattern matches
Type: enhancement Stage: resolved
Components: Interpreter Core Versions: Python 3.10
process
Status: closed Resolution:
Dependencies: Superseder:
Assigned To: brandtbucher Nosy List: Mark.Shannon, brandtbucher, gvanrossum, pablogsal
Priority: normal Keywords: patch

Created on 2021-04-06 20:00 by brandtbucher, last changed 2021-05-03 15:21 by pablogsal. This issue is now closed.

Pull Requests
URL Status Linked Edit
PR 25229 merged brandtbucher, 2021-04-06 20:00
PR 25855 merged pablogsal, 2021-05-03 14:52
Messages (5)
msg390368 - (view) Author: Brandt Bucher (brandtbucher) * (Python committer) Date: 2021-04-06 20:00
This draft PR contains a couple of pattern matching improvements I'm experimenting with. Most significantly, it implements behavior that several people requested during the PEP 634 feedback process: no more name bindings for partial matches.

(One caveat: all names are bound *before* evaluating the corresponding guard. If the guard fails, these bindings won't be rolled back before matching the next case.)

In short, this is accomplished by storing captured objects on the stack underneath the more immediately important stuff, popping them all on failure or storing them all only once the *entire* pattern for that case matches. The control flow needs to be greatly simplified in order to make this work correctly, so the patch replaces the current "push bools and jump if false a bunch of times" flow with something much more efficient: jumping straight into a run of POP_TOPs on failure. We already do something very similar to this in pattern_helper_sequence_unpack (the comments in the current code explain it well).

Parts of the new code are a bit more complex than before (especially or-patterns, which need to do a bit of juggling on the stack to reorder captured items and avoid popping important data on failure), and other parts can certainly still be improved... but I personally consider it a win to have more intuitive partial match behavior with no performance penalty.

I thought I'd loop a few of you in on it to hear your thoughts before progressing much further.
msg390499 - (view) Author: Brandt Bucher (brandtbucher) * (Python committer) Date: 2021-04-08 00:14
Guido informed me that Mark is currently maintaining a PEP 653 implementation branch. I checked it out today, and it looks like it has *lots* of conflicts with this one.

For the time being, I'm going to experiment with other ways of accomplishing this that don't involve rewriting most of the pattern compiler. That way we can minimize potential merge conflicts.
msg391827 - (view) Author: Brandt Bucher (brandtbucher) * (Python committer) Date: 2021-04-25 00:11
Since the feature freeze is coming up (and this changes the bytecode), I'd like to open this up for review now.

It probably shouldn't actually be merged before the AST changes in issue 43892, though. There will be quite a few conflicts that need resolving, but I'd rather integrate the AST changes into this PR than force Nick to integrate these deeper changes into his branch.
msg392717 - (view) Author: Brandt Bucher (brandtbucher) * (Python committer) Date: 2021-05-02 20:02
New changeset 0ad1e0384c8afc5259a6d03363491d89500a5d03 by Brandt Bucher in branch 'master':
bpo-43754: Eliminate bindings for partial pattern matches (GH-25229)
https://github.com/python/cpython/commit/0ad1e0384c8afc5259a6d03363491d89500a5d03
msg392812 - (view) Author: Pablo Galindo Salgado (pablogsal) * (Python committer) Date: 2021-05-03 15:21
New changeset 39494285e15dc2d291ec13de5045b930eaf0a3db by Pablo Galindo in branch 'master':
bpo-43754: Fix compiler warning in Python/compile.c (GH-25855)
https://github.com/python/cpython/commit/39494285e15dc2d291ec13de5045b930eaf0a3db
History
Date User Action Args
2021-05-03 15:21:05pablogsalsetmessages: + msg392812
2021-05-03 14:52:34pablogsalsetpull_requests: + pull_request24539
2021-05-02 20:05:54brandtbuchersetstatus: open -> closed
stage: patch review -> resolved
2021-05-02 20:02:20brandtbuchersetmessages: + msg392717
2021-04-25 00:11:06brandtbuchersetmessages: + msg391827
2021-04-08 00:14:13brandtbuchersetmessages: + msg390499
2021-04-06 20:00:41brandtbuchersetkeywords: + patch
stage: patch review
pull_requests: + pull_request23966
2021-04-06 20:00:31brandtbuchercreate