<div dir="ltr"><div><div><div><div>Hi all,<br><br></div>Regarding the behaviour of the "async with" statement: it seems that the description of it in PEP492, and the language documentation, do not match the behaviour of CPython (v3.6.1).<br><br>The PEP and the docs here:<br><a href="https://www.python.org/dev/peps/pep-0492/#asynchronous-context-managers-and-async-with">https://www.python.org/dev/peps/pep-0492/#asynchronous-context-managers-and-async-with</a><br><a href="https://docs.python.org/3/reference/compound_stmts.html#async-with">https://docs.python.org/3/reference/compound_stmts.html#async-with</a><br></div>say that "async with" is equivalent to a particular use of try/except/else.<br><br></div>But the implementation seems more like a try/except/finally, because the __aexit__ is always executed, even if a return statement is in the try block ("else" won't be executed if there's a "return" in the "try").  Also, as per normal "with", the implementation is a bit more complex than try/except/finally because you don't want to execute the __aexit__ method twice if there is an exception in the try.<br><br></div><div>Can someone please clarify the exact behaviour of "async with"?<br><br></div><div>Background: in implementing "async with" in MicroPython, we went by the PEP/docs, and now our behaviour doesn't match that of CPython.<br><br></div><div>Cheers,<br></div><div>Damien.<br><br></div></div>