New submission from Steven Silvester <>:

When writing an `async` function, we often want to `await` a method call that 
may or may not be `async`.  For instance, it may be synchronous in the base 
class, but asynchronous in the subclass on the instance we have been given.  It 
would be nice for `await foo` to be a no-op if `foo` does not have an 
`__await__` method.  For instance, the following works in EMCAScript 2017:  
`async function foo () { let bar = await 1; console.log(bar); }`.  As a 
workaround, we have been using `await force_async(`, where 
`force_async` is the following:

async def force_async(obj):
    """Force an object to be asynchronous"""
    if hasattr(obj, '__await__'):
        return await obj
    async def inner():
        return obj
    return await inner()

This functionality is roughly equivalent to `gen.maybe_future` for coroutines, 
that is now deprecated in Tornado.  cf

components: asyncio
messages: 323410
nosy: Steven Silvester, asvetlov, yselivanov
priority: normal
severity: normal
status: open
title: Relax Restrictions on await?
versions: Python 3.8

Python tracker <>
Python-bugs-list mailing list

Reply via email to