【发布时间】:2021-11-14 03:17:18
【问题描述】:
目前,我正在检查具有多个(例如三个)任意但相同类型的元组,格式如下:
from typing import Tuple, Union
Union[Tuple[int, int, int], Tuple[float, float, float]]
我想让这个检查更通用,也允许numpy 数字类型。 IE。我尝试使用numbers.Number:
from numbers import Number
from typing import Tuple
Tuple[Number, Number, Number]
上面的片段也允许混合类型的元组,只要一切都是数字。
我想将元组限制为相同类型的数字。
如何做到这一点?
从技术上讲,这个问题适用于 Python 和类型提示规范本身。但是,正如 cmets 中所指出的,它的处理是特定于实现的,即 MyPy 不会捕获所有边缘情况和/或不一致。就个人而言,我使用运行时检查 typeguard 进行测试,并在生产中完全停用它们。
【问题讨论】:
-
这有点棘手。我用
TypeVar尝试了一些东西,但后来意识到np.floating和np.integer是浮点数/整数,即isinstance(np.float64(3), float) -> True。 -
即使在您现有的注释中,如果您传入一个元组,其中一些项目是浮点数而一些是整数mypy-play.net/…,MyPy 将遗憾地无法引发错误
-
@timgeb Numpy 有一个类似于常规 Python 标准库的基本类:
np.number。此外,numpy.float64- 在大多数情况下,取决于配置、平台和编译器选项 (sys.float_info) - 与 Pythonfloat完全相同,所以这种事情对我来说实际上是可以的。 -
@AlexWaygood 我按照建议对问题添加了评论。我希望它有所帮助。静态分析并不能告诉我我想知道的一切。我正在使用
pytest和 hypothesis 以及运行时检查来折磨我的代码。 -
@s-m-e 你能解释一下为什么
T = TypeVar('T', int, float); Tuple[T, T, T]不适合你吗?它应该等同于您的“手动”版本Tuple[int, int, int]和Tuple[float, float, float],所以如果这些手动版本适合您,那么TypeVar版本也应该如此。
标签: python types tuples type-hinting python-typing