Skip to content

gh-156133: Add PyUnstable_InterpreterFrame_GetLocal - #156134

Open
guilhermeleobas wants to merge 6 commits into
python:mainfrom
guilhermeleobas:guilhermeleobas/frame-getlocals
Open

guilhermeleobas wants to merge 6 commits into
python:mainfrom
guilhermeleobas:guilhermeleobas/frame-getlocals

Conversation

@guilhermeleobas

@guilhermeleobas guilhermeleobas commented Aug 20, 2026 •

Copy link
Copy Markdown
Contributor

Add an unstable C API that reads a frame's local variables into a caller-provided array indexed by localsplus index, with cell and free variables unboxed to their contents. Free variables are resolved from the function closure, so the API also works on a frame that has not started executing (before COPY_FREE_VARS runs), which is the case that motivated it.

Includes the three PEP 689 deliverables:

  1. reference documentation in Doc/c-api/frame.rst
  2. a What's New entry for 3.16
  3. and tests (a C wrapper in Modules/_testinternalcapi.c driven by Lib/test/test_capi/test_frame_getlocals.py covering plain locals, a cell variable, and a free variable).

Authored with the assistance of an AI coding agent (Claude Opus)

@python-cla-bot

python-cla-bot Bot commented Aug 20, 2026 •

Copy link
Copy Markdown

All commit authors signed the Contributor License Agreement.

CLA signed

@read-the-docs-community

read-the-docs-community Bot commented Aug 20, 2026 •

Copy link
Copy Markdown

Comment thread Objects/frameobject.c Outdated
Comment thread Modules/_testinternalcapi.c Outdated
@aisk aisk changed the title gh-156133: Add PyUnstable_InterpreterFrame_GetLocals gh-156133: Add PyUnstable_InterpreterFrame_GetLocal Aug 21, 2026
Comment thread Objects/frameobject.c Outdated
Add an unstable C API that returns a strong reference to a single local
variable of an internal interpreter frame, addressed by its localsplus index,
with cell and free variables unboxed to their contents. Free variables are
resolved from the function closure, so the API also works on a frame that has
not started executing (before COPY_FREE_VARS runs) -- the case that motivated
it -- and it does not modify the frame.

Includes the PEP 689 deliverables: reference documentation in
Doc/c-api/frame.rst, a What's New entry for 3.16, a Misc/NEWS.d blurb, and
tests in Lib/test/test_capi/test_misc.py (TestInternalFrameApi) covering plain
locals, a cell variable, and a free variable.

Authored with the assistance of an AI coding agent (Claude Opus)
@guilhermeleobas
guilhermeleobas force-pushed the guilhermeleobas/frame-getlocals branch from cbb346a to d29acd6 Compare August 24, 2026 13:52
@guilhermeleobas

Copy link
Copy Markdown
Contributor Author

Thanks @aisk. I've addressed your comments.

@aisk

aisk commented Aug 24, 2026

Copy link
Copy Markdown
Member

Hi, thank you for the contribution, but please avoid using force push in the future, see: https://devguide.python.org/getting-started/pull-request-lifecycle/#don-t-force-push

@guilhermeleobas

guilhermeleobas commented Aug 24, 2026 •

Copy link
Copy Markdown
Contributor Author

https://devguide.python.org/getting-started/pull-request-lifecycle/#don-t-force-push

Sorry, it won't happen again. I did because the e-mail used in the commit was wrong and the cla-bot was failing.

@guilhermeleobas
guilhermeleobas requested a review from aisk September 7, 2026 20:13
@guilhermeleobas

Copy link
Copy Markdown
Contributor Author

@aisk could you take a look at this PR again once you have some cycles to spare?

Comment thread Doc/c-api/frame.rst Outdated
.. versionadded:: 3.12


.. c:function:: PyObject* PyUnstable_InterpreterFrame_GetLocal(struct _PyInterpreterFrame *frame, Py_ssize_t index)

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.

Ideally we should add an unstable API for the _PyInterpreterFrame struct too, right?

@guilhermeleobas guilhermeleobas Sep 17, 2026 •

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.

From the discuss topic, Petr said this can be done in a follow-up PR. I can add it here if you think it is necessary.

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.

I'll defer to him :)

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.

@encukou could you take a look at this PR once you have a chance?

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.

I will, after the 3.15.0 release.

Comment thread Doc/c-api/frame.rst Outdated
Comment thread Doc/c-api/frame.rst Outdated
@bedevere-app bedevere-app Bot added the type-feature A feature request or enhancement label Oct 1, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

awaiting review type-feature A feature request or enhancement

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants