在python的输入模块中检查范围类型

时间:2019-02-12 11:17:02

标签: python python-3.x typing

这与丢失typing.Range有关。

range软件包中没有typing的类型,但是同时我们看到typing.re.Match,这是面向软件包的类型。 typing.sequencetyping.Iterable太全面了。

是否有更好的方法来检查range类型并且仅检查range类型?除了使用:

range_instance.__class__ == range

更新

要清楚,我的意思是键入中的某些类型包括某物的所有元素或各个方面,例如typeing.Iterable(通用类型,没关系)

另一方面,还有特定的类型,例如

typing.Generatortyping.Tupletyping.Dicttyping.re.Match typing.AsyncContextManager,...

但不是

typing.Range

事实1:range类型与python中的类型不同 (例如,范围对检查其中的元素进行了额外的优化,有时知道您要处理列表或范围是有道理的)

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

知道这一点后,我认为typing.Range已丢失。

类型提示和类型检查之间的区别在这里无关紧要。

3 个答案:

答案 0 :(得分:2)

typing软件包interface segregation的主要思想。在大多数情况下,您不应该在乎传递的参数是否实际上是range对象,而是有关其功能的某些方面。在大多数情况下,typing.Iterable涵盖了该功能(我不明白您所说的“太全面”是什么意思。)

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

答案 1 :(得分:2)

而不是(不可能,因为 Typing.Range 不存在):

from typing import Range
    
def foo(r: Range) -> None:
    ...

就去做:

def foo(r: range) -> None:
    ...

由于 range 既是类型又是工厂函数,因此您不需要为范围单独设置类型。

请注意,存在诸如 Typing.Dict 之类的类型,因为虽然 dict 已经是一种类型,但以前不支持使用内置类型作为泛型,因此您不能将 dict[str, int] 作为一个类型注释,必须做 Dict[str, int]。但由于 range 在逻辑上不是泛型,因此 typing 中不需要单独的类型对应于 range 来支持泛型。

答案 2 :(得分:0)

您问:

  

除了以下方面,还有更好的方法来检查range类型,并且仅检查range类型:

range_instance.__class__ == range

在这种情况下,我认为您可以使用isinstance()(我在Python 3.x中对其进行了测试):

>>> isinstance(range(10), range)
True
>>> isinstance(list(range(10)), range)               # this is a list
False
>>> isinstance([1, 2, 3, 4], range)                  # this is a list
False
>>> isinstance((e for e in range(10)), range)        # this is a generator
False

如您所见,它可以正确识别范围对象,并且不会被列表或生成器所混淆。