@@ -287,8 +287,9 @@ returns a write-through proxy to the frame's local and locally referenced
287
287
nonlocal variables in these scopes, rather than returning an inconsistently
288
288
updated shared ``dict `` instance with undefined runtime semantics.
289
289
290
- See :pep: `667 ` for more details, including related C API changes and
291
- deprecations.
290
+ See :pep: `667 ` for more details, including related C API changes and deprecations. Porting
291
+ notes are also provided below for the affected :ref: `Python APIs <pep667-porting-notes-py >`
292
+ and :ref: `C APIs <pep667-porting-notes-c >`.
292
293
293
294
(PEP and implementation contributed by Mark Shannon and Tian Gao in
294
295
:gh: `74929 `. Documentation updates provided by Guido van Rossum and
@@ -2246,6 +2247,8 @@ Changes in the Python API
2246
2247
returned by :meth: `zipfile.ZipFile.open ` was changed from ``'r' `` to ``'rb' ``.
2247
2248
(Contributed by Serhiy Storchaka in :gh: `115961 `.)
2248
2249
2250
+ .. _pep667-porting-notes-py :
2251
+
2249
2252
* Calling :func: `locals ` in an :term: `optimized scope ` now produces an
2250
2253
independent snapshot on each call, and hence no longer implicitly updates
2251
2254
previously returned references. Obtaining the legacy CPython behaviour now
@@ -2341,15 +2344,27 @@ Changes in the C API
2341
2344
to :c:func: `PyUnstable_Code_GetFirstFree `.
2342
2345
(Contributed by Bogdan Romanyuk in :gh: `115781 `.)
2343
2346
2344
- * Calling :c:func: `PyFrame_GetLocals ` or :c:func: `PyEval_GetLocals ` in an
2345
- :term: `optimized scope ` now returns a write-through proxy rather than a
2346
- snapshot that gets updated at ill-specified times. If a snapshot is desired,
2347
- it must be created explicitly (e.g. with :c:func: `PyDict_Copy `) or by calling
2348
- the new :c:func: `PyEval_GetFrameLocals ` API. (Changed as part of :pep: `667 `.)
2347
+ .. _pep667-porting-notes-c :
2348
+
2349
+ * The effects of mutating the dictionary returned from :c:func: `PyEval_GetLocals ` in an
2350
+ :term: `optimized scope ` have changed. New dict entries added this way will now *only * be
2351
+ visible to subsequent :c:func: `PyEval_GetLocals ` calls in that frame, as
2352
+ :c:func: `PyFrame_GetLocals `, :func: `locals `, and
2353
+ :attr: `FrameType.f_locals <frame.f_locals> ` no longer access the same underlying cached
2354
+ dictionary. Changes made to entries for actual variable names and names added via the
2355
+ write-through proxy interfaces will be overwritten on subsequent calls to
2356
+ :c:func: `PyEval_GetLocals ` in that frame. The recommended code update depends on how the
2357
+ function was being used, so refer to the deprecation notice on the function for details.
2358
+ (Changed as part of :pep: `667 `.)
2359
+
2360
+ * Calling :c:func: `PyFrame_GetLocals ` in an :term: `optimized scope ` now returns a
2361
+ write-through proxy rather than a snapshot that gets updated at ill-specified times.
2362
+ If a snapshot is desired, it must be created explicitly (e.g. with :c:func: `PyDict_Copy `)
2363
+ or by calling the new :c:func: `PyEval_GetFrameLocals ` API. (Changed as part of :pep: `667 `.)
2349
2364
2350
2365
* :c:func: `!PyFrame_FastToLocals ` and :c:func: `!PyFrame_FastToLocalsWithError `
2351
2366
no longer have any effect. Calling these functions has been redundant since
2352
- Python 3.11, when :c:func: `PyFrame_GetLocals ` was first introduced.
2367
+ Python 3.11, when :c:func: `PyFrame_GetLocals ` was first introduced.
2353
2368
(Changed as part of :pep: `667 `.)
2354
2369
2355
2370
* :c:func: `!PyFrame_LocalsToFast ` no longer has any effect. Calling this function
@@ -2509,6 +2524,11 @@ Deprecated C APIs
2509
2524
:c:func: `PyWeakref_GetRef ` on Python 3.12 and older.
2510
2525
(Contributed by Victor Stinner in :gh: `105927 `.)
2511
2526
2527
+ * Deprecate the :c:func: `PyEval_GetBuiltins `, :c:func: `PyEval_GetGlobals `, and
2528
+ :c:func: `PyEval_GetLocals ` functions, which return a :term: `borrowed reference `.
2529
+ Refer to the deprecation notices on each function for their recommended replacements.
2530
+ (Soft deprecated as part of :pep: `667 `.)
2531
+
2512
2532
Pending Removal in Python 3.14
2513
2533
------------------------------
2514
2534
0 commit comments