Skip to content

gh-124697: Represent inlined comprehensions as subscopes in the symbol table - #156819

Open
iritkatriel wants to merge 18 commits into
python:mainfrom
iritkatriel:subscope
Open

gh-124697: Represent inlined comprehensions as subscopes in the symbol table#156819
iritkatriel wants to merge 18 commits into
python:mainfrom
iritkatriel:subscope

Conversation

@iritkatriel

@iritkatriel iritkatriel commented Sep 2, 2026

Copy link
Copy Markdown
Member

Resolves #124697

Inlined comprehensions are now represented in the symbol table as block of a new type InlinedComprehensionBlock, which is a subscope of the enclosing scope (not a separate compilation unit).

This moves the complexity of compiling inlined comprehensions from codegen to the symbol table
construction.

It removes the smell of the compiler modifying the symbol table in codegen.

iritkatriel and others added 2 commits September 2, 2026 12:12
…l tables

Co-authored-by: Cursor <cursoragent@cursor.com>
@read-the-docs-community

read-the-docs-community Bot commented Sep 2, 2026

Copy link
Copy Markdown

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

This looks great! Thank you for working on this ❤️

Comment thread Python/symtable.c Outdated
Comment thread Python/symtable.c
Comment thread Python/codegen.c
Comment thread Python/symtable.c Outdated
Comment thread Python/symtable.c Outdated

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

Very nice! This also fixes #121377 and #156664, but doesn't add tests for their reproducers. Can you add those tests?

I have a PR for the latter almost ready at #156691, but I'm happy to retire it in favor of this PR. @carljm @iritkatriel what do you think about backporting either my change or others? This PR feels a bit much to backport, but we may want to backport fixes for some of the bugs. 156691 is also a somewhat invasive change though.

Codex found that this now fails:

import sys

def outer(x):
    def inner():
        return [(lambda: x, dict(**sys._getframe().f_locals))
                for x in x]
    return inner()

outer([1])

With TypeError: dict() got multiple values for keyword argument 'x'.. #156691 has a larger change to framelocalsproxy to deal with this sort of thing; you may want to incorporate its approach.

@JelleZijlstra

Copy link
Copy Markdown
Member

Another relevant bug is #156091 but that one still crashes under this PR.

@carljm

carljm commented Sep 4, 2026

Copy link
Copy Markdown
Member

I'd be cautious about backporting an invasive fix for #156664. It's clearly a rarely-encountered edge case, given that nobody other than PyPy's test suite discovered the bug since 3.12, and the risk of introducing new bugs in an invasive fix seems high (particularly without this refactor in place.) I think "better the bugs you know than the ones you don't" applies in this case.

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.

refactor the implementation of inlined comprehensions

3 participants