当 __aenter__() 使用 'async with' 失败时会发生什么?
What happens when __aenter__() fails using 'async with'?
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 = await aenter(mgr)
不在 try
块中,所以我想知道是否允许 __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__
处理清洁更方便向上任意部分输入的上下文管理器状态。
(这与普通的非异步上下文管理器完全相同。)
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 = await aenter(mgr)
不在 try
块中,所以我想知道是否允许 __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__
处理清洁更方便向上任意部分输入的上下文管理器状态。
(这与普通的非异步上下文管理器完全相同。)