Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python collections.Iterable与type.Iterable在类型注释和检查Iterable中的比较_Python_Types_Annotations_Iterable_Isinstance - Fatal编程技术网

Python collections.Iterable与type.Iterable在类型注释和检查Iterable中的比较

Python collections.Iterable与type.Iterable在类型注释和检查Iterable中的比较,python,types,annotations,iterable,isinstance,Python,Types,Annotations,Iterable,Isinstance,我发现在Python中,collections.Iterable和typing.Iterable都可以用于类型注释和检查对象是否是Iterable,即isinstance(obj,collections.Iterable)和isinstance(obj,typing.Iterable)都可以工作。我的问题是,它们之间有什么区别?在哪种情况下,哪一种更受欢迎 typing.Iterable是泛型的,因此您可以在类型注释中说出Iterable是什么,例如,Iterable[int]表示Iterabl

我发现在Python中,
collections.Iterable
typing.Iterable
都可以用于类型注释和检查对象是否是Iterable,即
isinstance(obj,collections.Iterable)
isinstance(obj,typing.Iterable)
都可以工作。我的问题是,它们之间有什么区别?在哪种情况下,哪一种更受欢迎

typing.Iterable是泛型的,因此您可以在类型注释中说出Iterable是什么,例如,
Iterable[int]
表示Iterable of int

集合iterable是一个抽象基类。这些可以包括在创建自己的子类时使接口更易于实现

现在碰巧,
Iterable
不包含这些混入,但它是其他抽象基类接口的一部分

理论上,类型化iterable对这两者都有效,但它使用了一些奇怪的元类魔法,因此它们在所有情况下的行为方式并不完全相同。您确实不需要在运行时使用泛型,因此不需要在类型注释等之外使用泛型。集合iterable作为超类不太可能引起问题

因此,简而言之,您应该在类型注释中使用类型iterable,而将集合iterable用作超类


更新:


由于,从3.9版开始,Python的标准库容器类型也将能够接受类型注释的通用参数。这包括
collections.abc.Iterable
类。当只支持Python 3.9或更高版本时,就没有任何理由再使用
类型。Iterable
和从
类型导入这些容器类型将被弃用。

要补充关于Pep 585的观点,
类型.List[T]
将被简单的
列表[T]