<div dir="ltr">Howdy,<div><br></div><div>I'm experimenting with async/await in Python 3, and one very surprising behavior has been what happens when calling `await` twice on an Awaitable.  In C#, Hack/HHVM, and the new async/await spec in Ecmascript 7.  In Python, calling `await` multiple times results in all future results getting back `None`.  Here's a small example program:<br><div><br></div><div><font face="monospace, monospace"><br></font><div><div><div><font face="monospace, monospace">async def echo_hi():</font></div><div><font face="monospace, monospace">  Â  result = ''</font></div><div><font face="monospace, monospace">  Â  echo_proc = await asyncio.create_subprocess_exec(</font></div><div><font face="monospace, monospace">  Â  Â  Â  Â  Â  'echo', 'hello', 'world',</font></div><div><font face="monospace, monospace">  Â  Â  Â  Â  Â  stdout=asyncio.subprocess.PIPE,</font></div><div><font face="monospace, monospace">  Â  Â  Â  Â  Â  stderr=asyncio.subprocess.DEVNULL)</font></div><div><font face="monospace, monospace">  Â  result = await echo_proc.stdout.read()</font></div><div><font face="monospace, monospace">  Â  await echo_proc.wait()</font></div><div><font face="monospace, monospace">  Â  return result</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">async def await_twice(awaitable):</font></div><div><font face="monospace, monospace">  Â  print('first time is {}'.format(await awaitable))</font></div><div><font face="monospace, monospace">  Â  print('second time is {}'.format(await awaitable))</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">loop = asyncio.get_event_loop()</font></div><div><font face="monospace, monospace">loop.run_until_complete(await_twice(echo_hi()))</font></div></div><div><font face="monospace, monospace"><br></font></div><div>This makes writing composable APIs using async/await in Python very difficult since anything that takes an `awaitable` has to know that it wasn't already awaited.  Also, since the behavior is radically different than in the other programming languages implementing async/await it makes adopting Python's flavor of async/await difficult for folks coming from a language where it's already implemented.<font face="monospace, monospace"><br></font></div><div><br></div><div>In C#/Hack/JS calls to `await` return a Task/AwaitableHandle/Promise that can be awaited multiple times and either returns the result or throws any thrown exceptions.  It doesn't appear that the Awaitable class in Python has a `result` or `exception` field but `asyncio.Future` does.<br><br>Would it make sense to shift from having `await` functions return a <font face="arial, helvetica, sans-serif">`<em style="margin:0px;padding:0px;border:0px;font-stretch:inherit;line-height:28.125px;vertical-align:baseline;color:rgb(68,68,68);background-color:rgb(249,249,249)">Future-like`</em></font><em style="margin:0px;padding:0px;border:0px;font-stretch:inherit;font-size:15px;line-height:28.125px;font-family:SourceSansProItalic,Arial,sans-serif;vertical-align:baseline;color:rgb(68,68,68);background-color:rgb(249,249,249)"> </em>return object to returning a Future?</div><div><br></div><div>Thanks,</div><div>Roy</div><div><br></div><div><br></div></div></div></div></div>