Python3.7+中是否有默认的异步null上下文管理器?

7

我想要创建一个可选的异步信号量。
由于asyncio.Semaphore不支持None值,所以如果指定了连接限制,我将创建asyncio.Semaphore,否则 - 一些虚拟对象
有一个contextlib.nullcontext,但它仅支持同步的with
我自己创建了一个虚拟对象:

@contextlib.asynccontextmanager
async def asyncnullcontext():
    yield None

是否存在默认的异步空上下文管理器?

2个回答

8

是否有默认的异步空上下文管理器?

您可以使用contextlib.AsyncExitStack()

ExitStack()也是在引入nullcontext之前创建快速而简单的空上下文管理器的方法。


看起来有点滥用,但正好按照我想要的方式工作。 - Trizalio
1
@Trizalio 我认为“误用”这个词太过严厉,但我同意它有点晦涩难懂。有趣的事实是:将一个空上下文管理器添加到标准库最初是由我提出的,这已经快十年了。经过七年时间和许多不同人的说服,它终于被加入了标准库。也许你可以尝试使用asyncnullcontext? :) - user4815162342
1
@Trizalio 看起来 nullcontext 将在 Python 3.10 中支持 async with,供您参考。请查看此错误。@user4815162342 我猜现在事情进展得更快了 :) - thisisrandy

3

从Python 3.10+开始,contextlib.nullcontext() 可以作为同步和异步上下文管理器使用。

from contextlib import nullcontext

def works():
    with nullcontext():
        pass

async def works_too():
    async with nullcontext():
        pass

这个问题明确提到了Python 3.7,但我猜越来越多的人可能会在没有特别需要该版本的情况下找到它,因此这个答案适用于更高版本的Python。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接