检查 python 的类型模块中范围的类型

Sła*_*art 8 python type-hinting python-3.x

这是关于失踪typing.Range

range包中没有 for 类型typing,但同时我们看到typing.re.Match,这是一个面向包的类型。ortyping.sequencetyping.Iterable宽泛。

有没有更好的方法来检查range类型和仅range类型?除了使用:

range_instance.__class__ == range
Run Code Online (Sandbox Code Playgroud)

更新

需要明确的是,我的意思是打字中的某些类型包括某事物的所有元素或方面,例如typeing.Iterable(通用类型,这很好)

另一方面,也有非常具体的类型,例如

typing.Generator, typing.Tuple, typing.Dict, typing.re.Match typing.AsyncContextManager, ...

但不是

typing.Range

事实 1:range类型是 Python 中的不同类型(例如,范围具有额外的优化来检查其中的元素,有时知道您正在处理列表还是范围是有意义的)

事实 2:typing模块似乎涵盖了类型的所有方面。(如果您有疑问,请参阅那里的导入和逻辑)

知道这一点,我认为typing.Range是缺失的。

否则,人们会对使用哪一个感到困惑:

r: ranger: typing.Iterable或创建自定义别名

类型提示和类型检查之间的区别在这里并不重要。

blu*_*ote 6

typing封装的主要思想是接口隔离。在大多数情况下,您不应该关心传递的参数是否实际上是一个range对象,而应该关心其功能的某些方面。在大多数情况下,该功能已涵盖typing.Iterable(我不明白您所说的“太全面”是什么意思)。

另一方面,如果您想显式检查范围类型,只需使用isinstance(x, range)


小智 5

而不是(不可能,因为打字。范围不存在):

from typing import Range
    
def foo(r: Range) -> None:
    ...
Run Code Online (Sandbox Code Playgroud)

做就是了:

def foo(r: range) -> None:
    ...
Run Code Online (Sandbox Code Playgroud)

由于rangeis 已经是一种类型和工厂函数,因此您不需要为范围提供单独的类型。

请注意,存在像typing.Dict这样的类型,因为虽然dict它已经是一种类型,但以前不支持使用内置类型作为泛型,因此您不能将 dict[str, int] 作为类型注释,而必须使用 Dict [字符串,整数]。但由于range在逻辑上不是泛型,因此不需要typing对应的单独类型来range支持泛型。

  • 那么该使用哪一个呢?`r: range` 还是 `r: Typing.Iterable`? (3认同)