为何asyncio.Semaphore使用async with as语法会输出None?
问题解答
核心原因
asyncio.Semaphore 可以使用 async with as 语法,但它的异步上下文管理器的__aenter__方法返回None,这就是函数b中打印sem为None的根本原因。
具体分析
函数
a的执行逻辑
你提前创建了Semaphore实例并赋值给变量sem,async with sem仅负责获取信号量、进入上下文,打印的是你之前创建的sem实例本身,因此能输出信号量对象的信息。函数
b的执行逻辑async with asyncio.Semaphore(2) as sem中,as绑定的是Semaphore.__aenter__()方法的返回值。在Python 3.9的asyncio.Semaphore实现里,__aenter__仅完成信号量的获取操作,返回值为None,所以变量sem被赋值为None,打印自然输出None。
验证与补充
你可以通过简单测试验证这一点:
import asyncio async def test(): sem = asyncio.Semaphore(2) # 直接调用__aenter__方法查看返回值 result = await sem.__aenter__() print(result) # 输出: None await sem.__aexit__(None, None, None) asyncio.run(test())
如果需要在async with上下文内使用信号量实例,建议提前创建对象,就像函数a的写法一样。
内容的提问来源于stack exchange,提问作者baby195lxl
相关产品推荐
相关产品推荐

