这与丢失typing.Range
有关。
range
软件包中没有typing
的类型,但是同时我们看到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
已丢失。
类型提示和类型检查之间的区别在这里无关紧要。
答案 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
如您所见,它可以正确识别范围对象,并且不会被列表或生成器所混淆。