mypy报Missing positional argument错误:带None默认值的Optional参数为何无法省略
问题根源
你触发mypy报错的核心原因是带类型注解的函数签名和实际函数定义的参数默认值没有同步。
你写的类型注解签名里,仅给dict_2声明了Optional[Dict[str, str]]类型,没有标注该参数存在默认值,mypy做类型检查时会优先以带类型注解的签名为准,认为dict_2是必填位置参数,因此你只传第一个参数时会触发「缺失参数」的报错。
正确写法
你只需要把默认值和类型注解合并写到同一个函数定义中即可,mypy会自动识别默认值为None的参数支持省略传入:
from typing import Dict, Any, Optional def func(dict_1: Dict[str, Any], dict_2: Optional[Dict[str, str]] = None): # 你的函数逻辑 pass
如果你是单独在.pyi存根文件中维护类型注解,需要在存根的对应参数后加上= ...表示该参数存在默认值:
# .pyi存根文件中的写法 def func(dict_1: Dict[str, Any], dict_2: Optional[Dict[str, str]] = ...) -> None: ...
规则确认
- 你参考的Optional类型使用规则是正确的,默认值为None的参数用Optional标注完全符合mypy规范
- 修正注解后可以直接省略第二个参数调用
func(dict_val),不会再触发报错
内容的提问来源于stack exchange,提问作者Beliaev Maksim
相关产品推荐
相关产品推荐

