使用具有受限类型的TypeVar向函数添加类型

时间:2020-02-12 22:39:51

标签: python type-hinting typing mypy

documentation中,TypeVar用作泛型类型和泛型函数定义的参数。它还允许我们限制通用类型或函数的可能类型。

如果我使用mypy运行以下代码,它将正确地将y标识为int,将z标识为float

from typing import TypeVar, Any

Array = TypeVar("Array")

X = TypeVar("X", int, float, str, complex)


def identity(x: X) -> X:
    return x


if __name__ == '__main__':
    y = identity(5)
    z = identity(5.5)
    reveal_type(y)
    reveal_type(z)

但是,如果我将X的定义更改为X = TypeVar("X", int, float, str, complex, Any),那么我从mypy得到的显示的yz的类型仅为Any

我的问题是:这是一个错误还是我错误地使用了TypeVar?如果TypeVar是错误的输入方式,那么我应该如何键入此函数?

有趣的是,如果我改为将X定义为X = TypeVar("X", Any, int, float, str, complex),则可以像以前一样获得yz的正确显示类型,但是有关{ {1}}没有说任何关于命令的信息,这可能只是实现细节,而依赖于它会很脆弱。将TypeVar放在Any之后会显示int, float,y的类型为z,这是错误的。


注意:我实际上想添加到约束类型中的是numpy数组,但是由于它没有类型信息,因此mypy将其解释为complex,并且具有相同的效果。

0 个答案:

没有答案