From Python 3.5 coroutines formally became a distinct type and thus the async def syntax, along with await statements.
Prior to that, Python 3.4 created coroutines by wrapping regular functions into generators, hence the decorator syntax, and the more generator-like yield from.