rename generator -> iterator to better reflect reality - #2240
Merged
Conversation
ianhi
commented
Jun 24, 2026
The runtime class defines __class_getitem__ (to support subscripting in annotations), so the stub must declare it too or stubtest fails with "not present in stub".
paraseba
approved these changes
Jun 29, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The typing of these methods was inaccurately declaring them as generators when they were in fact iterators. See the bottom of this table https://docs.python.org/3/library/collections.abc.html#collections-abstract-base-classes. generators have
asend,athrowandaclose.This is pretty niche, but it did trick an agent into writing some broken code when I was using
array_chunk_iteratorto do some clever stuff with reading a virtualized file more effficietnyl. Specifically theacloseis useful in that situation to close the stream. Otherwise the iterator holds a session lock until the iterator is fully exhausted, then garbage collected. That is slower because we have to wait for the whole stream, and also leads to non-determinisitic behavior in the completion of the stream. Or it's also possible to accidentally deadlock yourself if youbreakout of the iter loop without finishing it. Withacloseyou'd have an escape hatch against that.So this PR does three related things:
acloseto our iterator to allow deterministic behavior on closing these streams.PyAsyncGeneratorto be anPyAsyncCloseableIterator-This is also where the
__class_getitem__comes from. It is necessary to allow subscripting for type annotations. We didn't need this previously because we were using the built incollections.AsyncIteratorin our annotations which is not strictly accurate.