Skip to content

Conversation

@adqm
Copy link
Contributor

@adqm adqm commented Dec 21, 2025

This PR is an implementation of PEP 798 (Unpacking in Comprehensions), reflecting the SC's required modification to genexp semantics from the original proposal.

Feedback is welcome! :)


📚 Documentation preview 📚: https://cpython-previews--143056.org.readthedocs.build/

Copy link
Member

@JelleZijlstra JelleZijlstra left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks! A few nitpicky comments, I didn't read past Lib/test yet.

adqm and others added 2 commits December 22, 2025 14:24
Copy link
Member

@JelleZijlstra JelleZijlstra left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The C code all looks good. I'll run it through the buildbots to make sure though.

@JelleZijlstra JelleZijlstra added the 🔨 test-with-buildbots Test PR w/ buildbots; report in status section label Dec 22, 2025
@bedevere-bot
Copy link

🤖 New build scheduled with the buildbot fleet by @JelleZijlstra for commit 81e86b3 🤖

Results will be shown at:

https://buildbot.python.org/all/#/grid?branch=refs%2Fpull%2F143056%2Fmerge

If you want to schedule another build, you need to add the 🔨 test-with-buildbots label again.

@bedevere-bot bedevere-bot removed the 🔨 test-with-buildbots Test PR w/ buildbots; report in status section label Dec 22, 2025
Copy link
Member

@ZeroIntensity ZeroIntensity left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm assuming the plan is to document this in 3.15 "What's New" later?

@adqm
Copy link
Contributor Author

adqm commented Dec 23, 2025

@ZeroIntensity Thanks for the review!

I'm assuming the plan is to document this in 3.15 "What's New" later?

I haven't drafted a blurb for "What's New" yet, but I'm happy to do so. I can do that in a separate PR later, or I don't mind adding it to this one if that's better.

@JelleZijlstra
Copy link
Member

Probably easiest to add the What's New entry here too.

@pablogsal
Copy link
Member

Will try to make a pass over the grammar next week if @lysnikolaou doesn't beat me to it

Copy link
Member

@lysnikolaou lysnikolaou left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I had a look at the grammar. The changes look great in general. I left a couple of minor comments, but feel free to merge if the PR is not blocked otherwise.

Maybe @pablogsal wants to give it a look as well?


if_expression[expr_ty]:
| a=disjunction 'if' b=disjunction 'else' c=expression { _PyAST_IfExp(b, a, c, EXTRA) }
| invalid_if_expression
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm pretty sure this alternative is never reached, since, in the second pass, it's encountered in expression before we get to if_expression and only in invalid rules otherwise that will overwrite the error either way.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for taking a look! Yep, I think you're right that we can't reach invalid_if_expression here, good catch. I'll push that change today (along with a what's new entry).

Comment on lines +896 to +898
| &'(' (genexp | tuple | group)
| &'[' (listcomp | list)
| &'{' (dictcomp | setcomp | dict | set)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changing the order here is probably only about error messages, right? If so, have you checked whether this affects parsing performance at all? To be clear, I'm okay to sacrifice a bit of performance for better error messages.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep, the reordering here was purely for error reporting. I hadn't done any performance testing before, but I did a quick, unscientific test this morning, doing some quick timings on ast.parse for a few things.

As might be expected, compared to the place I branched from, it looks like this branch is, in general, a little bit faster on comprehensions and a little bit slower on literal lists. It's a little hard to say how this works out on the whole, but the time for parsing the full standard library was always within ±2% every time I ran it. I can look more thoroughly if we're concerned about this, but this little test at least suggests that things haven't blown up on average.

Sample results:

TestReasonThis BranchMerge baseChange
[] (1e5 times)empty list0.58380.5539~5% slower
[x, y, z, a, b, c] (1e5 times)well-formed list1.40511.3827~2% slower
[1, 2, 3, 4, 5, 6 (1e5 times)broken list1.17501.1413~3% slower
[x for x in y if z and a] (1e5 times)well-formed comprehension1.16421.2393~6% faster
[x for x in (1e5 times)broken comprehension0.65680.7014~6% faster
[**x for x in y] (1e5 times)broken comprehension unpacking (new specific error message)1.26751.0519~20% slower
[x if x else y] (1e5 times)good ifexp1.01630.9890~3% slower
[*x if x else y] (1e5 times)broken ifexp (new specific error message)1.32991.7870~26% faster
full stdlib (5 times)26.164126.2642~equal

@JelleZijlstra
Copy link
Member

Going to "Update branch" to see if it fixes CI

@adqm
Copy link
Contributor Author

adqm commented Jan 30, 2026

Thanks @JelleZijlstra! Does "update branch" run a different set of tests? Unless I'm missing something, it looks like the test that's currently failing wasn't run on any of the earlier commits. Is that something I should be concerned about?

@ZeroIntensity
Copy link
Member

It's relatively new, so it wasn't on this PR before the update. I think it's an issue with main and not this PR, but we aren't blocked from merging by a failing CIFuzz anyway.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants