首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何使用AsyncGenerator和AsyncContextManager正确指定类型提示

在Python中,使用类型提示(type hints)可以帮助你编写更清晰、更易于维护的代码。对于异步生成器(AsyncGenerator)和异步上下文管理器(AsyncContextManager),你可以使用 typing 模块中的相应类型来指定类型提示。

1. 异步生成器(AsyncGenerator)

异步生成器是一个异步迭代器,通常使用 async defyield 关键字定义。你可以使用 typing.AsyncGenerator 来指定异步生成器的类型提示。

代码语言:javascript
复制
from typing import AsyncGenerator

async def async_gen() -> AsyncGenerator[int, None]:
    for i in range(5):
        yield i

在这个例子中,async_gen 是一个异步生成器,生成 int 类型的值,并且不接受任何发送值(None)。

2. 异步上下文管理器(AsyncContextManager)

异步上下文管理器允许你使用 async with 语句来管理资源。你可以使用 typing.AsyncContextManager 来指定异步上下文管理器的类型提示。

代码语言:javascript
复制
from typing import AsyncContextManager
from contextlib import asynccontextmanager

@asynccontextmanager
async def async_cm() -> AsyncContextManager[str]:
    print("Entering context")
    yield "Hello, World!"
    print("Exiting context")

在这个例子中,async_cm 是一个异步上下文管理器,管理一个 str 类型的资源。

3. 结合使用异步生成器和异步上下文管理器

有时,你可能需要结合使用异步生成器和异步上下文管理器。在这种情况下,你可以同时使用 AsyncGeneratorAsyncContextManager 来指定类型提示。

代码语言:javascript
复制
from typing import AsyncGenerator, AsyncContextManager
from contextlib import asynccontextmanager

@asynccontextmanager
async def async_gen_cm() -> AsyncContextManager[AsyncGenerator[int, None]]:
    async def inner_gen() -> AsyncGenerator[int, None]:
        for i in range(5):
            yield i

    print("Entering context")
    yield inner_gen()
    print("Exiting context")

在这个例子中,async_gen_cm 是一个异步上下文管理器,管理一个异步生成器,该生成器生成 int 类型的值。

4. 使用 TypeVarGeneric 进行泛型类型提示

如果你希望你的异步生成器或异步上下文管理器能够处理多种类型,可以使用 TypeVarGeneric 进行泛型类型提示。

代码语言:javascript
复制
from typing import TypeVar, Generic, AsyncGenerator, AsyncContextManager
from contextlib import asynccontextmanager

T = TypeVar('T')

class MyAsyncGen(Generic[T]):
    async def __call__(self) -> AsyncGenerator[T, None]:
        for i in range(5):
            yield i

@asynccontextmanager
async def async_gen_cm() -> AsyncContextManager[AsyncGenerator[T, None]]:
    async def inner_gen() -> AsyncGenerator[T, None]:
        for i in range(5):
            yield i

    print("Entering context")
    yield inner_gen()
    print("Exiting context")

在这个例子中,MyAsyncGen 是一个泛型类,可以生成任意类型的值。async_gen_cm 是一个泛型异步上下文管理器,管理一个泛型异步生成器。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

领券