[Async-sig] Asynchronous cleanup is a problem
Nathaniel Smith
njs at pobox.com
Wed Jul 6 19:06:38 EDT 2016
On Wed, Jul 6, 2016 at 1:12 PM, Yury Selivanov <yselivanov at gmail.com> wrote:
> This is an interesting idea, but I wonder if instead of using ‘async with’ we can actually augment ‘async for’ to do the async finalization.
>
> We can add an __aiter_close__ special method which will return an awaitable. In this case, ‘async for’ can always look for that method and call it at the end of the iteration. Async generators will implement the method to make sure that ‘finally’ is always executed (any number of awaits in ‘finally’ is OK; ‘yield’ expressions cannot be used).
I was wondering about that too. This is a fairly substantial change to
how iterators work, though -- currently, it's totally legal and
sometimes very useful to do things like
it = open("...")
# Discard header line (first non-commented line)
for line in it:
if not line.startswith("#"):
break
for body_line in it:
...
or nested for loops like:
for section_header_line in it:
section_info = parse_section_header_line(section_header_line)
if section_info.type == "multi-line":
for body_line in it:
if body_line == "-- end of section --":
break
else:
...
I guess there are a few different options in this design space -- one
could have a dedicated for+with syntax ("async forthwith"?), or an
opt-out utility like
for section_header_line in it:
for body_line in protect_from_close(it):
...
where protect_from_close returns a wrapper object that intercepts
__iter_close__ and ignores it, while passing through other method
calls (__next__/send/throw).
-n
--
Nathaniel J. Smith -- https://vorpus.org
More information about the Async-sig
mailing list