创建重载函数,忽略签名中不相关的参数

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

如何更改重载的签名,以向类型检查器发出信号,表明只有一个参数负责返回类型,而忽略所有其他参数?

代码(

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 mypy python-typing pyright
1个回答
0
投票

我使用 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)
© www.soinside.com 2019 - 2024. All rights reserved.