Skip to content

frame.f_locals for list/dict/set comprehension in module/class scope doesn't contain iteration variables #108732

Closed
@chgnrdv

Description

@chgnrdv

Bug report

Checklist

  • I am confident this is a bug in CPython, not a bug in a third-party project
  • I have searched the CPython issue tracker,
    and am confident this bug has not been reported before

CPython versions tested on:

CPython main branch

Operating systems tested on:

Linux

Output from running 'python -VV' on the command line:

Python 3.13.0a0 (heads/main:dd32611f4f, Aug 31 2023, 20:23:23) [GCC 10.2.1 20210110]

A clear and concise description of the bug:

The following assertion fails with PEP 709 (c3b595e):

import sys
f_locs = None
[f_locs := sys._getframe().f_locals for a in range(1)]
assert 'a' in f_locs

This was discovered when trying to inspect listcomp iteration variable under pdb, as it makes inspection of these variables impossible:

> /home/radislav/projects/cpython/listcomp.py(1)<module>()
-> [print(a) for a in range(1)]
(Pdb) s
0
> /home/radislav/projects/cpython/listcomp.py(1)<module>()
-> [print(a) for a in range(1)]
(Pdb) print(a)
*** NameError: name 'a' is not defined
(Pdb) s
/home/radislav/projects/cpython/listcomp.py:1: RuntimeWarning: assigning None to unbound local 'a'
  [print(a) for a in range(1)]
--Return--
> /home/radislav/projects/cpython/listcomp.py(1)<module>()->None
-> [print(a) for a in range(1)]

As I can see, it happens because iteration vars are now stored in "fast hidden locals" that aren't included into frame->f_locals on _PyFrame_FastToLocalsWithError(frame) call, and thus are not accessible through PyFrameObject f_locals attribute.

cc @carljm

Linked PRs

Metadata

Metadata

Assignees

Labels

type-bugAn unexpected behavior, bug, or error

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions