我的函数定义包含命名和未命名的 kwargs:
def safe_format(text: str, max_errors: int = 10, **kwargs: str) -> None:
print(text)
print(max_errors)
print(kwargs)
如果我在没有指定 max_errors 的情况下调用它:
safe_format(some_str, **some_dict)
我确实得到了预期的结果(打印了 some_str,然后打印了 10,然后打印了 some_dict)。然而 mypy 不高兴,并认为我正在尝试使用 some_dict 作为 max_errors 的值:
Argument 2 to "safe_format" has incompatible type "**Dict[str, str]"; expected "int"
我可以使用特定的语法让 mypy 识别我在做什么吗?
根据评论,我设法让它与
typing.overload
一起工作
from typing import overload
@overload
def safe_format(text: str, max_errors: int = 10, **kwargs: str) -> None:
...
@overload
def safe_format(text: str, max_errors=..., **kwargs: str) -> None:
...
def safe_format(text: str, max_errors: int = 10, **kwargs: str) -> None:
print(text)
print(max_errors)
print(kwargs)
# mypy doesn't complain
safe_format("FOO", **{"kwarg1": "bar", "kwarg2": "BIGBAR"})
# mypy does complain because of kwarg1
safe_format("FOO", **{"kwarg1": 42, "kwarg2": "BIGBAR"})