在Python中,使用类型提示(type hints)可以帮助你编写更清晰、更易于维护的代码。对于异步生成器(AsyncGenerator
)和异步上下文管理器(AsyncContextManager
),你可以使用 typing
模块中的相应类型来指定类型提示。
异步生成器是一个异步迭代器,通常使用 async def
和 yield
关键字定义。你可以使用 typing.AsyncGenerator
来指定异步生成器的类型提示。
from typing import AsyncGenerator
async def async_gen() -> AsyncGenerator[int, None]:
for i in range(5):
yield i
在这个例子中,async_gen
是一个异步生成器,生成 int
类型的值,并且不接受任何发送值(None
)。
异步上下文管理器允许你使用 async with
语句来管理资源。你可以使用 typing.AsyncContextManager
来指定异步上下文管理器的类型提示。
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
类型的资源。
有时,你可能需要结合使用异步生成器和异步上下文管理器。在这种情况下,你可以同时使用 AsyncGenerator
和 AsyncContextManager
来指定类型提示。
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
类型的值。
TypeVar
和 Generic
进行泛型类型提示如果你希望你的异步生成器或异步上下文管理器能够处理多种类型,可以使用 TypeVar
和 Generic
进行泛型类型提示。
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
是一个泛型异步上下文管理器,管理一个泛型异步生成器。
领取专属 10元无门槛券
手把手带您无忧上云