直接在python REPL中使用await

iho*_*yam 32 python asynchronous python-asyncio

我想知道是否有一种方法可以直接从 python REPL调用async函数?await

因此以以下代码为例:

import aiohttp
import asyncio


async def somefunc():
    async with aiohttp.ClientSession() as session:
        host_url = 'https://somehost'
        async with session.get(host_url) as resp:
            response = await resp.json()
        return response
Run Code Online (Sandbox Code Playgroud)

我正在寻找的是一种调试类似功能的简单方法,基本上我想

>>> result = await somefunc()
Run Code Online (Sandbox Code Playgroud)

我知道这可以通过

import asyncio

loop = asyncio.get_event_loop()
loop.run_until_complete(somefunc())
Run Code Online (Sandbox Code Playgroud)

但是使用这种方法,我需要更改 somefunc 的主体来记录响应的结果,或者使用额外的异步函数(如下所示)来打印结果

async def result_print():
    result = await somefunc()
    print(result)

loop = asyncio.get_event_loop()
loop.run_until_complete(result_print())
Run Code Online (Sandbox Code Playgroud)

总结以上内容,我正在寻找一种更方便的方法来在 python REPL 中等待异步函数,也许是一个自定义 REPL 实现,允许

>>> result = await somefunc()
Run Code Online (Sandbox Code Playgroud)

或者可能有一种方法可以在我不知道的 python 默认 repl 中做到这一点?

dir*_*irn 64

如果您使用以下命令启动 REPL,则可以实现您想要的行为

python -m asyncio
Run Code Online (Sandbox Code Playgroud)

  • 这是为 https://bugs.python.org/issue37028 实现的,仍在等待有人复制选项卡完成和历史文件的代码。实现它的人似乎更喜欢引导人们使用 ipython,它已经做到了这一点,然后不幸的是有人关闭了这个问题,尽管实现只是一个例子。某处可能会有更新的讨论。 (4认同)
  • 我还注意到这只适用于 python 3.8 或更高版本 (3认同)