gpt4 book ai didi

python - 键入提示 @asynccontextmanager 的返回值的正确方法是什么?

转载 作者:行者123 更新时间:2023-12-05 05:00:17 26 4
gpt4 key购买 nike

使用 @asynccontextmanager 装饰器为函数的返回添加类型提示的正确方法是什么?这是我进行的两次尝试,但都失败了。

from contextlib import asynccontextmanager
from typing import AsyncContextManager


async def caller():
async with return_str() as i:
print(i)

async with return_AsyncContextManager() as j:
print(j)


@asynccontextmanager
async def return_str() -> str:
yield "hello"


@asynccontextmanager
async def return_AsyncContextManager() -> AsyncContextManager[str]:
yield "world"

对于ij Pylance在 vscode 中显示类型 Any。我考虑过的其他想法:

  • 我想也许我可以将类型信息传递给装饰器本身(如 @asynccontextmanager(cls=str),但我找不到任何示例或任何描述我可以传入的参数。
  • async with return_str() as i: # type: str 也不起作用。即使有,我也宁愿在函数定义处提示,而不是在每次调用时提示。类型注释不是很干。
  • 我试图用 __aenter()____aexit()__ 函数创建一个 AsyncContextManager 类,但没有成功。如果它有效,我会回过头来,但我更愿意让装饰器工作,因为它更简洁。

这是我悬停在 return_AsyncContextManager() 函数上的屏幕截图,并显示 Pylance 弹出窗口说它返回 AsyncContextManager[_T] enter image description here

最佳答案

您必须提示 AsyncIterator 作为返回类型,如下所示:

@asynccontextmanager
async def my_acm() -> AsyncIterator[str]:
yield "this works"


async def caller():
async with my_acm() as val:
print(val)

这是因为 yield 关键字用于创建生成器。考虑:

def a_number_generator():
for x in range(10): # type: int
yield x

g = a_number_generator() # g is type Generator[int]

考虑到 type hints for @asynccontextgenerator,这是有道理的:
asynccontextmanager(func: Callable[..., AsyncIterator[_T]]) -> Callable[..., AsyncContextManager[_T]]

要解析的内容很多,但它表示 asynccontextgenerator 接受一个返回 AsyncIterator 的函数,并将其转换为一个返回 AsyncContextManager 的新函数> 通用类型 _T 也被保留。

这是一个屏幕截图,显示类型提示传输到调用函数中。

enter image description here

关于python - 键入提示 @asynccontextmanager 的返回值的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63125259/

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