对于泛型可变参数函数,使用参数类型的联合而不是超类型

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

我有一个通用函数

one_of
,它可以返回它的任何(变量)参数。它的返回类型可能是其所有参数的超类型;但是,我想用其类型的 union 来注释其使用位置。

from typing import TypeVar
import random


T = TypeVar("T")


def one_of(*args: T) -> T:
    return random.choice(args)


def int_or_str() -> int | str:
    return one_of(1, "one")

这是 mypy 提供的错误:

vararg_type.py:11: error: Incompatible return value type (got "object", expected "Union[int, str]")
Found 1 error in 1 file (checked 1 source file)

我想我可以在每个调用站点上

cast
返回值
one_of
,但是还有其他方法可以更好地使用类型检查器吗?

python python-typing mypy
1个回答
1
投票

我不知道这是否“更好”,但 mypy 只使用

object
,因为它选择不默认为
int | str
。所以你可以告诉它使用
int | str
。只要暗示一个就足够了

def int_or_str() -> int | str:
    one: int | str = "one"
    return one_of(1, one)

可能有一种更简洁的写法。

© www.soinside.com 2019 - 2024. All rights reserved.