为具有命名和未命名 kwargs 的函数键入提示

问题描述 投票:0回答:1

我的函数定义包含命名和未命名的 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 识别我在做什么吗?

python mypy
1个回答
0
投票

根据评论,我设法让它与

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"})
© www.soinside.com 2019 - 2024. All rights reserved.