diff --git a/README.rst b/README.rst index 2b4a8b1..5d8e149 100644 --- a/README.rst +++ b/README.rst @@ -21,15 +21,35 @@ The async_generator library =========================== -Python 3.6 added `async generators -`__. (What's an async -generator? `Check out my 5-minute lightning talk demo from PyCon 2016 -`__.) Python 3.7 adds some more -tools to make them usable, like ``contextlib.asynccontextmanager``. +Many Python programmers already know and love `generators +`__, +because they're a super convenient way to write your own iterators +that you can loop over using ``for``. Python 3.6 added a new thing: +`async generators `__. Just +like regular generators, they're super convenient; the difference is +that now you loop over them using ``async for``, and this means you +can use ``await`` inside them. If you're not doing async programming, +you probably don't care about this at all. But if you *are* doing +async programming, this is *super awesome*. If you're not convinced, +check out this `5-minute demo +`__ (warning: contains +Nathaniel's first ever attempt to live-code on stage). + +But what if you aren't using the latest and greatest Python, but still +want that async generator goodness? That's where this package comes +in. It gives you async generators and ``@asynccontextmanager`` on +Python 3.5+. + +**Example 1:** suppose you want to **write your own async generator**. +The goal is that you can use it like: -This library gives you all that back to Python 3.5. +.. code-block:: python3 + + async for json_obj in load_json_lines(stream_reader): + ... -For example, this code only works in Python 3.6+: +If you're using Python 3.6+, you could implement `load_json_lines` +using native syntax: .. code-block:: python3 @@ -37,7 +57,8 @@ For example, this code only works in Python 3.6+: async for line in stream_reader: yield json.loads(line) -But this code does the same thing, and works on Python 3.5+: +Or, you could use ``async_generator``, and now your code will work on +Python 3.5+: .. code-block:: python3 @@ -48,7 +69,17 @@ But this code does the same thing, and works on Python 3.5+: async for line in stream_reader: await yield_(json.loads(line)) -Or in Python 3.7, you can write: + +**Example 2:** let's say you want to **write your own async context +manager**. The goal is to be able to write: + +.. code-block:: python3 + + async with background_server() as ...: + ... + +If you're using Python 3.7+, you don't need this library; you can +write something like: .. code-block:: python3 @@ -64,7 +95,7 @@ Or in Python 3.7, you can write: # Kill the server when the scope exits nursery.cancel_scope.cancel() -This is the same, but back to 3.5: +This is the same, but works on 3.5+: .. code-block:: python3 @@ -81,8 +112,9 @@ This is the same, but back to 3.5: # Kill the server when the scope exits nursery.cancel_scope.cancel() -(And if you're on 3.6, you can use ``@asynccontextmanager`` with -native generators.) +(And if you're on 3.6, so you have built-in async generators but no +built-in ``@asynccontextmanager``, then don't worry, you can use +``async_generator.asynccontextmanager`` on native async generators.) Let's do this