PEP 709: add notes from discussion thread (#3032)
This commit is contained in:
parent
98235c7a0b
commit
57f118e963
27
pep-0709.rst
27
pep-0709.rst
|
@ -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
|
implementation of this PEP. In the future, some generator expressions may be
|
||||||
inlined, where the returned generator object does not leak.
|
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
|
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
|
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.
|
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
|
How to Teach This
|
||||||
=================
|
=================
|
||||||
|
|
Loading…
Reference in New Issue