如何使用选项类型内的类型来约束泛型

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

我正在尝试改进一个组合两个相同类型值的函数,目前支持 int 和 str。这是我当前的实现:

def combine[T: (int, str)](a: T, b: T) -> T:
    match a:
        case int():
            return a + b
        case str():
            return a + b

这通过了 mypy 类型检查。但是,我想让它更具可扩展性,以便将来添加其他类型。我想使用类型别名 possibleTypeForCombine 来表示允许的类型。我尝试将其定义为:

possibleTypeForCombine = int | str
# or
from typing import Union
possibleTypeForCombine = Union[int, str]

我的目标是将来能够轻松地向 possibleTypeForCombine 添加新类型,并让 mypy 通知我需要在使用此类型的函数中添加新案例。 我尝试在新版本的函数中使用此类型别名:

def combine2[T: possibleTypeForCombine](a: T, b: T) -> T:
    match a:
        case int():
            c = a + b
            return c
        case str():
            c = a + b
            return c

但是,这会导致以下 mypy 错误:

错误:缺少返回语句 [return] 错误:不支持的操作数 +(“str”和“T”)[运算符]的类型错误:返回不兼容 值类型(得到“str”,期望“T”)[返回值]

我当然预料到了。约束泛型类型的语法是 T: (可能类型 1, 可能类型 2)。

我想知道是否可以制作类似的东西

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

这在这里有描述。您应该将类型包装在

type[...]
:

possibleTypeForCombine = type[int | str]


def combine2[T: possibleTypeForCombine](a: T, b: T) -> T:
    match a:
        case int():
            c = a + b
            return c
        case str():
            c = a + b
            return c
© www.soinside.com 2019 - 2024. All rights reserved.