gpt4 book ai didi

python - 当 __aenter__() 使用 'async with' 失败时会发生什么?

转载 作者:行者123 更新时间:2023-12-03 08:28:32 26 4
gpt4 key购买 nike

PEP 492提到:

async with EXPR as VAR:
BLOCK

在语义上等同于:

mgr = (EXPR)
aexit = type(mgr).__aexit__
aenter = type(mgr).__aenter__

VAR = await aenter(mgr)
try:
BLOCK
except:
if not await aexit(mgr, *sys.exc_info()):
raise
else:
await aexit(mgr, None, None, None)

但是, VAR = wait aenter(mgr) 不在 try block 中,所以我想知道是否允许 __aenter__()失败。

例如,在此 aiohttp 代码段(取自 Getting Started ):

import aiohttp
import asyncio

async def main():

async with aiohttp.ClientSession() as session:
async with session.get('http://python.org') as response:

print("Status:", response.status)
print("Content-type:", response.headers['content-type'])

html = await response.text()
print("Body:", html[:15], "...")

loop = asyncio.get_event_loop()
loop.run_until_complete(main())

session.get('http://python.org') 可能会失败,并且不会调用 __aexit__() 来关闭上下文。

最佳答案

如果__aenter__失败,__aexit__确实不会运行。在这种情况下,任何所需的清理工作都是 __aenter__ 的责任。

__aenter__ 有更多关于它走了多远以及什么已经或没有成功初始化的信息,因此让 __aenter__ 处理这个比期望 __aexit__ 更方便 处理清理任意部分进入的上下文管理器状态。

(这与普通的非异步上下文管理器完全相同。)

关于python - 当 __aenter__() 使用 'async with' 失败时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65889720/

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