异步协程上的高阶函数

jho*_*eau 5 python python-asyncio

假设我有一个功能:

def f(x):
    return {"x": x}
Run Code Online (Sandbox Code Playgroud)

我可以创建一个高阶函数,其行为如下:

def augment(func):
    def augmented_function(x):
         return {**func(x), "metadata": "test"}
    return augmented_function
Run Code Online (Sandbox Code Playgroud)

然后augment(f)(1)将返回{"x": 1, "metadata": "test"}

但是如果f是异步协程,这个增强函数不起作用(RuntimeWarning: coroutine 'f' was never awaitedTypeError: 'coroutine' object is not a mapping) - 我希望增强函数是一个可以等待的协程:

async def f(x):
    return {"x": x}

def augment_async(coro):
   xxx

augment_async(f)(1) # Should return <coroutine object xxx>
await augment_async(f)(1) # Should return {"x": 1, "metadata": "test"}
Run Code Online (Sandbox Code Playgroud)

有谁知道augment_async在这种情况下怎么写?

谢谢。

编辑:奖金问题。

augment_async比如await augment_async(f(1))return怎么写{"x": 1, "metadata": "test"}

Mis*_*agi 4

制作内部函数 就足够了async,这样它就可以成为await包装函数:

\n
def augment_async(func):\n    async def augmented_function(x):\n         return {**await func(x), "metadata": "test"}\n    return augmented_function\n\nawait augment_async(f)(1) # evaluates to {"x": 1, "metadata": "test"}\n
Run Code Online (Sandbox Code Playgroud)\n
\n

对于 \xe2\x80\x9caugment\xe2\x80\x9d 实例化协程f(1),单层就足够了:

\n
 async def direct_async(coro):\n     return {**await coro, "metadata": "test"}\n
Run Code Online (Sandbox Code Playgroud)\n

请注意augment_async,与为协程生成工厂的 不同,direct_async直接生成协程 - 它的结果可能await只被 ed 一次。

\n