如何解决mypy对函数kwargs传参报类型不兼容错误的问题
问题根因与解决方法
1. mypy参数类型不兼容报错
根因
你定义的foo函数中,this、is、worse、than四个参数虽然标注了Optional类型,但并没有设置默认值,属于必填参数。调用时你只传入了第一个位置参数100,剩下三个必填参数缺失,mypy识别到参数数量不匹配才抛出该报错。
解决方案
二选一即可:
- 方案1:调用时补全所有必填参数,没有有效值的
Optional参数可直接传None:
from datetime import datetime foo(100, None, None, None, **{'C': True})
- 方案2:给无默认值的
Optional参数设置默认值None,改为非必填参数:
from datetime import datetime from typing import Optional def foo( this: Optional[int] = None, is: Optional[str] = None, worse: Optional[datetime] = None, than: Optional[float] = None, C: Optional[bool] = True, **kwargs ): print("for no apparent, valid reason!") # 此时调用无需传全所有参数,mypy不会报错 foo(100, **{'C':True})
2. multiple values for "xxx" were found报错
根因
同一个参数同时通过位置/关键字传参、**kwargs传了两次值,Python解释器在调用阶段就会直接抛出冲突错误。
解决方案
调用时确保同一个参数仅通过一种方式传值即可:
错误示例(重复传入
worse参数):foo(100, None, datetime.now(), None, **{"worse": None})修正示例:
# 仅在kwargs中传入worse foo(100, None, **{"worse": datetime.now(), "than": None}) # 或仅通过关键字参数传入worse foo(100, None, worse=datetime.now(), than=None)
额外优化:增强mypy对kwargs的校验能力
如果你的**kwargs只会传入固定的几个扩展参数,可以用TypedDict标注kwargs的类型,避免传错键或值类型:
from typing import TypedDict, Optional from datetime import datetime class FooKwargs(TypedDict, total=False): # 按实际需求定义允许传入的kwargs键和对应类型 extra_param1: str extra_param2: int def foo( this: Optional[int] = None, is: Optional[str] = None, worse: Optional[datetime] = None, than: Optional[float] = None, C: Optional[bool] = True, **kwargs: FooKwargs ): print("for no apparent, valid reason!")
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

