【发布时间】:2019-07-06 00:44:24
【问题描述】:
这是关于缺少typing.Range。
typing包中没有range的类型,但同时我们看到typing.re.Match,这是一个面向包的类型。
typing.sequence 或 typing.Iterable 太宽泛了。
有没有更好的方法来检查range 类型并且只检查range 类型?除了使用:
range_instance.__class__ == range
更新:
明确地说,我的意思是打字中的某些类型包括某物的所有元素或方面,例如typeing.Iterable(通用类型,这很好)
另一方面,也有非常特定的类型,如
typing.Generator, typing.Tuple, typing.Dict, typing.re.Match
typing.AsyncContextManager, ...
但不是
typing.Range
事实 1:range 类型是 python 中的不同类型
(例如,一个范围有额外的优化用于检查那里的元素,有时知道你是在处理列表还是范围是有意义的)
事实 2:typing 模块似乎涵盖了类型的所有方面。
(如果您有疑问,请参阅那里的导入和逻辑)
知道这一点,我认为typing.Range 不见了。
否则,人们对使用哪一个感到困惑:
r: range 或 r: typing.Iterable 或创建自定义别名
类型提示和类型检查之间的区别在这里并不重要。
【问题讨论】:
-
isinstance(range_instance, range)有什么问题吗? -
您混淆了两个相似但不同的东西:类型化模块为类型注释提供了泛型类型,用于文档和提示ing。另一方面,类型检查是可靠的检查对象是从定义的类或父类派生的。它在某些用例中可能是有效的,但它通常反对 Python 的鸭子类型概念。
-
@Klaus:不,我不这样做,因为
typing不仅服务于泛型类型,而且由于该模块基于types、collections、abc等,所以有使用该包不仅可以用于类型提示,还可以用于类型检查。当然,我们不限于使用该模块进行类型检查。也许这根本不应该是第一次尝试。
标签: python python-3.x type-hinting