You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在Python的async with语句中同时声明多个变量?

异步async with多上下文管理器的写法

结论:完全可以像同步with那样,在async with中同时声明多个异步上下文管理器,你给出的写法本身符合语法规范,只要A和B是合法的异步上下文管理器,代码就能正常运行。

合法异步上下文管理器的要求

一个类要成为异步上下文管理器,必须实现两个异步方法:

  • __aenter__():进入上下文时调用,返回的对象会绑定到as后的变量
  • __aexit__(exc_type, exc, tb):退出上下文时调用,用于执行资源清理逻辑

可运行示例代码

下面是完整的可运行示例,模拟你代码中的A和B类:

import asyncio

class A:
    async def __aenter__(self):
        print("进入A的上下文")
        return self
    
    async def __aexit__(self, exc_type, exc, tb):
        print("退出A的上下文")
    
    async def A(self):
        await asyncio.sleep(1)
        return "来自A的结果"

class B:
    async def __aenter__(self):
        print("进入B的上下文")
        return self
    
    async def __aexit__(self, exc_type, exc, tb):
        print("退出B的上下文")
    
    async def B(self):
        await asyncio.sleep(0.5)
        return "来自B的结果"

async def main():
    async with A() as a, B() as b:
        for _ in range(3):  # 用有限循环演示,替代无限循环
            result_1 = await a.A()
            result_2 = await b.B()
            if result_1:
                print(result_1)
            if result_2:
                print(result_2)

asyncio.run(main())

常见报错排查

如果你的代码运行异常,大概率是A或B类未满足异步上下文管理器的要求:

  • 未实现__aenter__或__aexit__方法
  • 这两个方法未添加async关键字(不是异步方法)
  • __aenter__未返回需要绑定的对象(比如self)

内容的提问来源于stack exchange,提问作者darren

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 11:50:23