New submission from Serhiy Storchaka <storchaka+cpyt...@gmail.com>:
There is a number of issues with "async for".
1. When assigning to the target raises StopAsyncIteration (in custom
__setitem__, __setattr__ or __iter__) it will be silenced and will cause to
2. StopAsyncIteration is dynamically looked up in globals. If set the global
StopAsyncIteration or delete it from builtins (for example at the shutdown
stage), this will break any "async for".
3. The f_lineno setter doesn't handle jumping into or out of the "async for"
block. Jumping into is not forbidden, and jumping out doesn't update the stack
correctly. This can cause a crash or incorrect behavior (like iterating wrong
4. The compiler doesn't check all errors when creating new blocks. Some blocks
are not used. And the resulting bytecode is suboptimal.
I'll create a series of pull request for fixing all this issue. Some of them
can be backported. Others require changes in bytecode or are too hard for
implementing in 3.7 and earlier versions (the related code was changed in
issue17611). Some of them depend on other PRs or other issues (like issue33026)
and need to wait until their be merged.
components: Interpreter Core
nosy: serhiy.storchaka, yselivanov
title: Issues with "async for"
versions: Python 3.6, Python 3.7, Python 3.8
Python tracker <rep...@bugs.python.org>
Python-bugs-list mailing list