【发布时间】:2016-09-22 19:45:09
【问题描述】:
我有一个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 语句?如果没有,是否有其他方法可以实现这一点 - 也许使用旧式上下文管理器?
【问题讨论】:
-
asyncio还引入了async with异步上下文管理器协议,请参阅:python.org/dev/peps/pep-0492/… -
这看起来正是我想要的。当我有机会时会尝试实施它。
-
从 3.7 开始(2018 年发布),contextlib 将有
@asynccontextmanager
标签: python asynchronous contextmanager