gpt4 book ai didi

python - 异步上下文管理器

转载 作者:IT老高 更新时间:2023-10-28 22:13:51 24 4
gpt4 key购买 nike

我有一个 asynchronous API我用它来连接和发送邮件到一个 SMTP 服务器,该服务器有一些设置和拆除它。所以它非常适合使用 Python 3 的 contextlib 中的 contextmanager

不过,我不知道是否可以写,因为他们都使用生成器语法来写。

这可能说明了问题(包含 yield-base 和 async-await 语法的混合,以说明异步调用和向上下文管理器屈服之间的区别)。

@contextmanager
async def smtp_connection():
client = SMTPAsync()
...

try:
await client.connect(smtp_url, smtp_port)
await client.starttls()
await client.login(smtp_username, smtp_password)
yield client
finally:
await client.quit()

目前在python中这种事情可能吗?如果是,我将如何使用 with as 语句?如果没有,是否有其他方法可以实现这一点 - 也许使用旧式上下文管理器?

最佳答案

从 Python 3.7 开始,您可以编写:

from contextlib import asynccontextmanager

@asynccontextmanager
async def smtp_connection():
client = SMTPAsync()
...

try:
await client.connect(smtp_url, smtp_port)
await client.starttls()
await client.login(smtp_username, smtp_password)
yield client
finally:
await client.quit()

在 3.7 之前,您可以使用 async_generator包这个。在 3.6 上,你可以写:

# This import changed, everything else is the same
from async_generator import asynccontextmanager

@asynccontextmanager
async def smtp_connection():
client = SMTPAsync()
...

try:
await client.connect(smtp_url, smtp_port)
await client.starttls()
await client.login(smtp_username, smtp_password)
yield client
finally:
await client.quit()

如果你想一直工作回到 3.5,你可以这样写:

# This import changed again:
from async_generator import asynccontextmanager, async_generator, yield_

@asynccontextmanager
@async_generator # <-- added this
async def smtp_connection():
client = SMTPAsync()
...

try:
await client.connect(smtp_url, smtp_port)
await client.starttls()
await client.login(smtp_username, smtp_password)
await yield_(client) # <-- this line changed
finally:
await client.quit()

关于python - 异步上下文管理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37433157/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com