如何更改重载的签名,以向类型检查器发出信号,表明只有一个参数负责返回类型,而忽略所有其他参数?
代码(
mypy
和pyright
都没有抱怨):
from typing import Literal, overload
@overload
def test(switch: Literal[True]) -> int: ...
@overload
def test(switch: Literal[False]) -> None: ...
def test(switch: bool) -> int | None:
return 123 if switch is True else None
test_int: int = test(True)
test_none: None = test(False)
现在我添加一个与返回类型无关的参数:
虽然这有效:
def test(switch: bool, var: str = '') -> int | None:
我在重载实现方面遇到了这两个签名的错误:
def test(switch: bool, var: str) -> int | None:
def test(var: str = '', switch: bool = True) -> int | None:
我使用 Python 的类型模块创建了一个重载函数,以表明只有“switch”参数决定返回类型,而忽略所有其他参数。我使用带有文字类型的 @overload 装饰器来实现精确的输入规范,并在函数签名中使用 *args 和 **kwargs 来允许任何附加参数而不影响类型检查。这种方法保持了未来修改的灵活性,同时确保对关键“开关”参数进行严格的类型检查。该实现使用简洁的条件表达式来仅根据“switch”参数确定返回值,从而有效地忽略所有其他输入。
期待更有经验的Python专家的建议 - 我还在学习中,我的建议可能还不是最佳的
from typing import Literal, overload, TypeVar, Any
T = TypeVar('T')
@overload
def test(switch: Literal[True], *args: Any, **kwargs: Any) -> int: ...
@overload
def test(switch: Literal[False], *args: Any, **kwargs: Any) -> None: ...
@overload
def test(switch: bool, *args: Any, **kwargs: Any) -> int | None: ...
def test(switch: bool, *args: Any, **kwargs: Any) -> int | None:
return 123 if switch is True else None
# Testing
test_int: int = test(True, "ignored", irrelevant=42)
test_none: None = test(False, "also ignored", whatever=3.14)