循环内变量args和kwargs的类型注解位置问题(mypy报错)
循环内变量args和kwargs的类型注解位置问题(mypy报错)
嘿,我来帮你搞定这个mypy的报错问题~
你遇到的Need type annotation for "args" [var-annotated]和Need type annotation for "kwargs" [var-annotated]错误,本质是mypy没法自动推断出for循环里args和kwargs的具体类型,解决方法很简单——直接在for循环的变量定义里给它们加上类型注解就行,Python 3.9+和mypy都支持这种写法。
结合你的代码,修改后的版本如下:
from typing import Any, Dict, Optional, Sequence, Tuple import itertools expected_args: Optional[Sequence[Tuple[Any, ...]]] expected_kwargs: Optional[Sequence[Dict[str, Any]]] expected_args_iter = iter(expected_args or ()) expected_kwargs_iter = iter(expected_kwargs or ()) # 直接在循环变量后添加类型注解 for args: Optional[Tuple[Any, ...]], kwargs: Optional[Dict[str, Any]] in itertools.zip_longest( expected_args_iter, expected_kwargs_iter, fillvalue={} ): # 这里写你的循环逻辑 pass
这里我给args注解成Optional[Tuple[Any, ...]],kwargs注解成Optional[Dict[str, Any]],是因为zip_longest会在其中一个迭代器耗尽时用fillvalue填充。不过有个小细节要提醒你:你当前设置的fillvalue={}是字典类型,和args原本的元组类型不匹配,可能会导致后续类型问题,如果你希望耗尽时填充空值,把fillvalue改成None会让类型更统一哦。
另外还有一种替代写法,你可以先给zip_longest的返回结果指定类型,再循环遍历,效果是一样的:
# 先给zip_longest的结果指定类型 zip_items: itertools.zip_longest[Optional[Tuple[Any, ...]], Optional[Dict[str, Any]]] = itertools.zip_longest( expected_args_iter, expected_kwargs_iter, fillvalue={} ) for args, kwargs in zip_items: # 循环逻辑 pass
不过第一种直接在循环变量加注解的方式更直观,也更贴合你现在的需求。
备注:内容来源于stack exchange,提问作者Sujay
相关产品推荐
相关产品推荐

