PEP 709: add notes from discussion thread (#3032)

This commit is contained in:
Carl Meyer 2023-02-28 16:24:22 -07:00 committed by GitHub
parent 98235c7a0b
commit 57f118e963
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 27 additions and 0 deletions

View File

@ -139,6 +139,21 @@ Generator expressions are currently never inlined in the reference
implementation of this PEP. In the future, some generator expressions may be
inlined, where the returned generator object does not leak.
In more complex cases, the comprehension iteration variable may be a global or
cellvar or freevar in the outer function scope. In these cases, the compiler
also internally pushes and pops the scope information for the variable when
entering/leaving the comprehension, so that semantics are maintained. For
example, if the variable is a global outside the comprehension, ``LOAD_GLOBAL``
will still be used where it is referenced. If it is a cellvar/freevar outside
the comprehension, the ``LOAD_FAST_AND_CLEAR`` / ``STORE_FAST`` used to
save/restore it do not change (there is no ``LOAD_DEREF_AND_CLEAR``), meaning
that the entire cell (not just the value within it) is saved/restored, so the
comprehension does not write to the cell.
In effect, comprehensions introduce a sub-function scope where local variables
are fully isolated, but without the performance cost or stack frame entry of a
call.
Backwards Compatibility
=======================
@ -224,6 +239,18 @@ comprehension and its containing function and point to a calling frame outside
the library. In such a scenario it would usually be simpler and more reliable
to raise the warning closer to the calling code and bypass fewer frames.
Impact on other Python implementations
======================================
Per comments from representatives of `GraalPython
<https://discuss.python.org/t/pep-709-inlined-comprehensions/24240/20>`_ and
`PyPy <https://discuss.python.org/t/pep-709-inlined-comprehensions/24240/22>`_,
they would likely feel the need to adapt to the observable behavior changes
here, given the likelihood that someone, at some point, will depend on them.
Thus, all else equal, fewer observable changes would be less work. But these
changes (at least in the case of GraalPython) should be manageable "without much
headache".
How to Teach This
=================