FazBrowse GitHub Viewer | Trending |
URL:
| Home
Tools: [Download Repo ZIP]   [Original HTTPS Page]

gh-143055: Implementation of PEP 798 by adqm · Pull Request #143056 · python/cpython · GitHub

Repository navigation

gh-143055: Implementation of PEP 798 - #143056

Merged
JelleZijlstra merged 16 commits into
python:mainfrom
adqm:pep798
Jan 31, 2026
Merged

JelleZijlstra merged 16 commits into
python:mainfrom
adqm:pep798

Conversation

adqm commented Dec 21, 2025 •
edited by github-actions Bot
Loading

Copy link
Copy Markdown
Contributor

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/

JelleZijlstra left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low Quality

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

Comment thread Doc/reference/expressions.rst Outdated
Comment thread Doc/reference/expressions.rst Outdated
Comment thread Doc/tutorial/datastructures.rst Outdated
Comment thread Grammar/python.gram Outdated
Comment thread Grammar/python.gram

JelleZijlstra left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low Quality

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

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

Copy link
Copy Markdown

🤖 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 removed the 🔨 test-with-buildbots Test PR w/ buildbots; report in status section label Dec 22, 2025

ZeroIntensity left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low Quality

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

Comment thread Doc/reference/expressions.rst Outdated
Comment thread Doc/reference/expressions.rst Outdated

adqm commented Dec 23, 2025

Copy link
Copy Markdown
Contributor Author

@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.

Copy link
Copy Markdown
Member

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

Copy link
Copy Markdown
Member

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

lysnikolaou left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low Quality

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?

Comment thread Grammar/python.gram Outdated

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

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low Quality

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
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low Quality

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 thread Grammar/python.gram
Comment on lines +896 to +898
| &'(' (genexp | tuple | group)
| &'[' (listcomp | list)
| &'{' (dictcomp | setcomp | dict | set)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low Quality

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
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low Quality

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

Copy link
Copy Markdown
Member

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

adqm commented Jan 30, 2026

Copy link
Copy Markdown
Contributor Author

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?

Copy link
Copy Markdown
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.

JelleZijlstra merged commit ccbe41e into python:main Jan 31, 2026
48 of 50 checks passed

Copy link
Copy Markdown

⚠️⚠️⚠️ Buildbot failure ⚠️⚠️⚠️

Hi! The buildbot AMD64 FreeBSD14 3.x (tier-3) has failed when building commit ccbe41e.

What do you need to do:

  1. Don't panic.
  2. Check the buildbot page in the devguide if you don't know what the buildbots are or how they work.
  3. Go to the page of the buildbot that failed (https://buildbot.python.org/#/builders/1232/builds/7885) and take a look at the build logs.
  4. Check if the failure is related to this commit (ccbe41e) or if it is a false positive.
  5. If the failure is related to this commit, please, reflect that on the issue and make a new Pull Request with a fix.

You can take a look at the buildbot page here:

https://buildbot.python.org/#/builders/1232/builds/7885

Summary of the results of the build (if available):

==

Click to see traceback logs
Traceback (most recent call last):
  File "/home/buildbot/buildarea/3.x.opsec-fbsd14/build/Lib/test/support/__init__.py", line 947, in gc_collect
    gc.collect()
    ~~~~~~~~~~^^
ResourceWarning: unclosed <socket.socket fd=8, family=2, type=1, proto=6, laddr=('127.0.0.1', 50174), raddr=('127.0.0.1', 54992)>
Warning -- Unraisable exception
Exception ignored while calling deallocator <function _SelectorTransport.__del__ at 0x1c7f3879be90>:
Traceback (most recent call last):
  File "/home/buildbot/buildarea/3.x.opsec-fbsd14/build/Lib/asyncio/selector_events.py", line 873, in __del__
    _warn(f"unclosed transport {self!r}", ResourceWarning, source=self)
    ~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ResourceWarning: unclosed transport <_SelectorSocketTransport closing fd=8>
k


Traceback (most recent call last):
  File "/home/buildbot/buildarea/3.x.opsec-fbsd14/build/Lib/test/support/__init__.py", line 947, in gc_collect
    gc.collect()
    ~~~~~~~~~~^^
ResourceWarning: unclosed <socket.socket fd=8, family=2, type=1, proto=6, laddr=('127.0.0.1', 60632), raddr=('127.0.0.1', 51955)>
Warning -- Unraisable exception
Exception ignored while calling deallocator <function _SelectorTransport.__del__ at 0x1bd099e02990>:
Traceback (most recent call last):
  File "/home/buildbot/buildarea/3.x.opsec-fbsd14/build/Lib/asyncio/selector_events.py", line 873, in __del__
    _warn(f"unclosed transport {self!r}", ResourceWarning, source=self)
    ~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ResourceWarning: unclosed transport <_SelectorSocketTransport closing fd=8>
k

Copy link
Copy Markdown
Member

Looks unrelated

adqm commented Feb 1, 2026

Copy link
Copy Markdown
Contributor Author

Exciting to see this merged! Thanks for the help, everyone :)

If issues with the code do come up, I'm happy to help fix them.

thunder-coding pushed a commit to thunder-coding/cpython that referenced this pull request Feb 15, 2026
Co-authored-by: Jelle Zijlstra <jelle.zijlstra@gmail.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants


Back | FazBrowse Home | New Git URL