Python 当使用'时uu aenter_uuuuuuuuuuuuuuuuuuuuuo()失败时会发生什么;与';异步;?
报告提到:Python 当使用'时uu aenter_uuuuuuuuuuuuuuuuuuuuuo()失败时会发生什么;与';异步;?,python,python-3.x,python-asyncio,semantics,aiohttp,Python,Python 3.x,Python Asyncio,Semantics,Aiohttp,报告提到: 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
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
块中,因此我想知道\uuu-aenter\uuu()
是否允许失败
例如,在这个aiohttp
片段中(取自):
session.get('http://python.org“)
可能会失败,并且不会调用\uuuuuuuuuuuuuuuuuuuuuu()
来关闭上下文。如果\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu\uuuuuu
失败,确实不会运行。在这种情况下,任何需要的清理都是\uuuu aenter\uuuu
的责任
\uuuuuu aenter\uuuuuuu
有更多关于它达到了什么程度以及成功初始化了什么或没有初始化什么的信息,因此使用\uuuuuuuuu aenter\uuuuuuuuuu
处理此操作要比期望\uuuuuuuuuuuu aexit\uuuuuu
处理任意部分输入的上下文管理器状态更方便
(这与普通的非异步上下文管理器完全相同。)和\uuuuu aexit\uuu()
不会被调用来关闭上下文。-你指的是什么背景?会话将关闭,因为异常发生在与
异步的外部的主体中。如果您的意思是response
,则没有什么可关闭的,因为session.get(…)
从未完成运行,而是引发了异常。
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())