具有多个任意但类型相同的元组

s-m*_*m-e 10 python types tuples type-hinting python-typing

目前,我正在检查具有多个(例如三个)任意但相同类型的元组,其形式如下:

from typing import Tuple, Union

Union[Tuple[int, int, int], Tuple[float, float, float]]
Run Code Online (Sandbox Code Playgroud)

我想让这个检查更通用,也允许numpy数字类型。即我尝试使用numbers.Number

from numbers import Number
from typing import Tuple

Tuple[Number, Number, Number]
Run Code Online (Sandbox Code Playgroud)

上面的片段还允许混合类型的元组,只要一切都是数字。

我想将元组限制为相同类型的数字。

如何才能实现这一目标?


从技术上讲,这个问题适用于 Python 和类型提示规范本身。然而,正如评论中指出的,它的处理是特定于实现的,即 MyPy 不会捕获每个边缘情况和/或不一致。就我个人而言,我使用带有typeguard 的运行时检查进行测试,并在生产中完全停用它们。

use*_*327 9

您可以TypeVarbound参数一起使用。它允许将类型限制为给定类型的子类型。在您的情况下,类型应该是以下类型的子类型Number

\n
from numbers import Number\nfrom typing import TypeVar\n \nT = TypeVar(\'T\', bound=Number)\nTuple[T, T, T]\n
Run Code Online (Sandbox Code Playgroud)\n

为什么它有效?

\n

TypeVar是一个变量,允许在类型签名中多次使用特定类型。最简单的例子:

\n
from typing import TypeVar, Tuple\n\nT = TypeVar(\'T\')\nR = TypeVar(\'R\')\n\ndef swap(x: T, y: R) -> Tuple[R, T]:\n    return y, x\n
Run Code Online (Sandbox Code Playgroud)\n

静态类型检查器将推断函数的参数swap应与相反顺序的输出相同(请注意,返回类型 T 将与输入类型 T 相同)。

\n

接下来,引入对 的限制可能会很有用TypeVar。例如,可以将类型变量的值限制为特定类型:TypeVar(\'T\', int, str)。在这个答案中,我们使用另一种带有关键字bound\xe2\x80\x93 的限制,它检查类型变量的值是否是给定类型的子类型(在我们的例子中,Number,它是所有数字类型的基类) Python)。

\n

更多示例:mypy 文档PEP 484

\n
\n

工作测试:

\n
from numbers import Number\nfrom typing import TypeVar\n \nT = TypeVar(\'T\', bound=Number)\nTuple[T, T, T]\n
Run Code Online (Sandbox Code Playgroud)\n