为何Python 3.13及以上版本在asyncio REPL中输入async with语句会抛出IndentationError?
为何Python 3.13及以上版本在asyncio REPL中输入async with语句会抛出IndentationError?
嘿,这个问题我刚好也留意到了!你在Python 3.13及以上版本的asyncio REPL(就是通过uv run --python <版本号> python -m asyncio启动的专属交互环境)里遇到的IndentationError,其实是3.13版本对REPL的语法交互逻辑做了调整导致的,而且看起来是个还没修复的小问题。
先跟你确认下现象完全匹配:你输入async with httpx.AsyncClient() as client:这行后,3.13+的REPL直接跳出来报错,连输入缩进代码块的机会都不给;但换成3.12及以下版本,REPL会乖乖显示...提示符,让你接着写缩进里的逻辑——哪怕最后因为其他原因报错,至少多行语句的交互流程是正常的。
具体现象对比
Python 3.13+的报错场景
启动REPL后输入代码的完整流程:
asyncio REPL 3.13.0 (main, Oct 16 2024, 03:23:02) [Clang 18.1.8 ] on linux Use "await" directly instead of "asyncio.run()". >>> import asyncio >>> import httpx >>> async with httpx.AsyncClient() as client: File "<stdin>", line 1 async with httpx.AsyncClient() as client: ^ IndentationError: expected an indented block after 'with' statement on line 1
Python 3.12及以下的正常交互
同样的操作在旧版本里能进入多行输入环节:
asyncio REPL 3.12.10 (main, Apr 9 2025, 04:03:51) [Clang 20.1.0 ] on linux Use "await" directly instead of "asyncio.run()". >>> import asyncio >>> import httpx >>> async with httpx.AsyncClient() as client: ... r = await client.get('https://www.example.com/') ... Traceback (most recent call last): ...
临时解决办法
目前有两个简单的方式能绕过这个问题:
- 单行写法:如果逻辑简单,直接把缩进代码和
async with写在同一行:>>> async with httpx.AsyncClient() as client: r = await client.get('https://www.example.com/') - 封装异步函数:把包含
async with的逻辑包进异步函数,再通过await调用,这也是更规范的方式:>>> async def fetch_example(): ... async with httpx.AsyncClient() as client: ... return await client.get('https://www.example.com/') ... >>> response = await fetch_example()
额外说明
这个问题应该是Python 3.13在优化REPL语法解析时引入的回归bug,毕竟你测试到3.13.8和3.14预览版都还存在这个问题。如果在意的话,可以关注Python官方的bug跟踪系统,说不定后续小版本就会修复啦。
备注:内容来源于stack exchange,提问作者Simon Pratt
相关产品推荐
相关产品推荐

