[Async-sig] [ANN] async_generator v1.2 released

Alex Grönholm alex.gronholm at nextday.fi
Fri Nov 25 03:03:49 EST 2016


24.11.2016, 23:23, Nathaniel Smith kirjoitti:
>
> On Nov 23, 2016 11:29 PM, "Alex Grönholm" <alex.gronholm at nextday.fi 
> <mailto:alex.gronholm at nextday.fi>> wrote:
> >
> > 23.11.2016, 01:34, Nathaniel Smith kirjoitti:
> >>
> >> On Tue, Nov 22, 2016 at 2:22 PM, Alex Grönholm 
> <alex.gronholm at nextday.fi <mailto:alex.gronholm at nextday.fi>> wrote:
> >> > I'm not sure where asyncio_extras's async generator 
> implementation assumes
> >> > you're using asyncio. Could you elaborate on that?
> >>
> >> If I'm reading it right, it assumes that the only two things that 
> might be yielded to the coroutine runner are either (a) the special 
> yield wrapper, or (b) an awaitable object like an asyncio.Future. This 
> works on asyncio, because that's all the asyncio runner supports, but 
> it doesn't work with (for example) curio. async_generator (like native 
> async generators) allows arbitrary objects to be yielded to the 
> coroutine runner.
> >
> > You are misreading the code. It is in no way limited to what asyncio 
> accepts. It doesn't even import asyncio in the asyncyield or generator 
> modules. The only parts of the library that depend on PEP 3156 event 
> loops are the ones that involve executors and threads.
>
> I didn't say that it imported asyncio. I said that it assumes the only 
> things that will be yielded are the things that asyncio yields. This 
> is the line that I'm worried about:
>
> https://github.com/agronholm/asyncio_extras/blob/aec412e1b7034ca3cad386c381e655ce3547fee3/asyncio_extras/asyncyield.py#L40
>
> The code awaits the value yielded by the coroutine, but there's no 
> guarantee that this value is awaitable. It's an arbitrary Python 
> object representing a message sent to the coroutine runner. It turns 
> out that asyncio only uses awaitable objects for its messages, so this 
> code can get away with this on asyncio, but if you try using this code 
> with curio then I'm pretty sure you're going to end up doing something 
> like "await (3,)" and then blowing up.
>
PEP 492 clearly states the following:

It is aTypeErrorto pass anything other than an/awaitable/object to 
anawaitexpression.

That (3,) is not an awaitable, so the example is invalid. That said, I 
will re-examine this part of the implementation and correct it if 
necessary. So far I just haven't encountered anything that would produce 
an error.

> >> > Native async generators don't support "yield from" either, so I 
> didn't try
> >> > to add that until there's a new PEP that defines its exact semantics.
> >>
> >> Yeah, one of the motivations for async_generator has been to figure 
> out what the semantics for native generators should be :-). The native 
> async generators in 3.6 use the same implementation trick as 
> async_generator (not entirely sure if Yury got it from me, or if it's 
> an independent invention), and the yield from implementation is partly 
> motivated as a proof of concept / testing ground for hopefully getting 
> it into 3.7. The yield from semantics are pretty straightforward 
> though, I think.
> >>
> >> > As for
> >> > aclose/asend/athrow support, I will have to look into that.
> >> >
> >> > Could we synchronize the implementations so that they're 
> compatible with
> >> > each other? I would've preferred there to be only a single 
> implementation
> >> > (asyncio_extras was published first, but admittedly I didn't 
> advertise it
> >> > that well) but now it'd be best if we work together, wouldn't you 
> agree?
> >>
> >> Makes sense to me :-). I think the obvious approach would be for 
> async_extras to just depend on async_generator, since AFAICT 
> async_generator is pretty much complete, and like you say, there's not 
> much point in carrying around two copies of the same thing. But if you 
> have another suggestion I'd be interested to hear it...
> >
> > I may consider that at some point, but I'm not yet comfortable with 
> those extended capabilities. Meanwhile I will add any missing 
> functionality (asend, athrow etc.) to mine.
>
> You could just not import yield_from_ and then you don't have any 
> extended capabilities... but up to you, obviously.
>
> > One thing I noticed is that there seems to be no way to detect async 
> generator functions in your implementation. That is something I would 
> want to have before switching.
>
> Good point. That should be pretty trivial to add.
>
> -n
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/async-sig/attachments/20161125/e97a2d4c/attachment-0001.html>


More information about the Async-sig mailing list