能否在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
相关产品推荐
相关产品推荐

