AsyncGenerator可选类型标注冗余性及Pylance告警问题咨询
异步生成器类型标注问题解答
示例代码
from typing import AsyncGenerator, Optional import asyncio async def gen1() -> Optional[AsyncGenerator[int, None]]: for i in range(5): yield i await asyncio.sleep(0.1) async def gen2() -> AsyncGenerator[int, None]: for i in range(5): yield i await asyncio.sleep(0.1)
Pyrogram库同类标注案例
例如Pyrogram中部分异步生成器函数的类型标注:
from typing import Optional, AsyncGenerator async def get_messages(...) -> Optional[AsyncGenerator[Message, None]]: # 函数实现
问题解答
1. gen1中的Optional类型标注是否冗余?
是冗余的。异步生成器函数只要包含yield语句,就必然返回AsyncGenerator实例,不可能返回None或其他非异步生成器类型。你的判断正确——这个函数不存在返回非AsyncGenerator的情况,添加Optional完全没必要,反而会造成类型检查工具的误解。
2. VS Code的Pylance在异步类型处理上是否存在问题?
这是Pylance对异步生成器函数类型标注的严格校验逻辑导致的。Pylance会明确要求异步生成器函数的返回类型必须是AsyncGenerator或AsyncIterable的直接标注,不允许用Optional这类容器类型包裹,因为从语法和运行逻辑上,异步生成器函数不可能返回None。
mypy和PyCharm的类型检查逻辑相对宽松,允许这种不符合规范的标注不报错,但这并不代表标注正确。本质上Pylance的提示是合理的,它在严格遵循异步生成器的类型规范,而非处理逻辑存在问题。
内容的提问来源于stack exchange,提问作者user3144525
相关产品推荐
相关产品推荐

