示例如下,需要确保IDE类型判断器或reveal_type能够正确识别kji类型.

也许有某种方法可以建议输入args是空的tuplekwargs是空的dict,那么返回值就是tuple[int]

from typing import Union, overload

def test(*args: int, **kwargs: str) -> Union[int, str, tuple[int]]:
    if args:
        return 5
    if kwargs:
        return "5"
    return (5,)


# now all are Union[int, str, tuple[int]]
k = test(1)
j = test(i="1")
i = test()

reveal_type(k) # should be int
reveal_type(j) # should be str
reveal_type(i) # should be tuple[int]

推荐答案

这是一个可能的解决方案,允许mypy推断kji的正确类型.这种方法确实会导致mypy抱怨过载签名重叠.我不确定除了简单地 suppress 错误之外是否还有可能解决这个问题.

from typing import Union, overload


@overload
def test() -> tuple[int]:  # type: ignore[overload-overlap]
    ...
    
@overload
def test(*args: int) -> int:  # type: ignore[overload-overlap]
    ...
    
@overload
def test(**kwargs: str) -> str:
    ...

def test(*args: int, **kwargs: str) -> Union[int, str, tuple[int]]:
    if args:
        return 5
    if kwargs:
        return "5"
    return (5,)


# now all are Union[int, str, tuple[int]]
k = test(1)
j = test(i="1")
i = test()

reveal_type(k) # should be int
reveal_type(j) # should be str
reveal_type(i) # should be tuple[int]

mypy --strict v1.9.0(try it online!)的输出:

main.py:29: note: Revealed type is "builtins.int"
main.py:30: note: Revealed type is "builtins.str"
main.py:31: note: Revealed type is "tuple[builtins.int]"
Success: no issues found in 1 source file

Python相关问答推荐

根据给定日期的状态过滤查询集

pandas DataFrame GroupBy.diff函数的意外输出

如何在Windows上用Python提取名称中带有逗号的文件?

计算组中唯一值的数量

如何将Docker内部运行的mariadb与主机上Docker外部运行的Python脚本连接起来

Pandas:将多级列名改为一级

从spaCy的句子中提取日期

海上重叠直方图

递归访问嵌套字典中的元素值

给定高度约束的旋转角解析求解

如何在Python中获取`Genericums`超级类型?

如何在FastAPI中为我上传的json文件提供索引ID?

剪切间隔以添加特定日期

合并与拼接并举

按条件添加小计列

以极轴表示的行数表达式?

用0填充没有覆盖范围的垃圾箱

如何在PYTHON中向单元测试S Side_Effect发送额外参数?

try 在单个WITH_COLUMNS_SEQ操作中链接表达式时,使用Polars数据帧时出现ComputeError

多个布尔条件的`jax.lax.cond`等效项