Python中的collections
模块和collections.abc
模块在功能和目的上有所不同,但它们之间存在紧密的关联:
相同点:
- 都与Python容器类型(如字典、列表、集合等)的高级使用有关。
差异点:
-
collections模块:
- 提供了一系列具体的容器数据类型实现,这些类型是对Python内置类型的补充和增强。例如:
Counter
,defaultdict
,namedtuple
,deque
,OrderedDict
等。 - 这些都是可以直接使用的具体类,可用于解决特定场景下的问题,比如计数、默认值处理、命名元组等。
- 提供了一系列具体的容器数据类型实现,这些类型是对Python内置类型的补充和增强。例如:
-
collections.abc模块(抽象基类库):
- 自Python 3.3开始引入,这个模块定义了多个抽象基类(ABC),用于表示不同类型的容器接口规范,包括但不限于
Mapping
,MutableMapping
,Sequence
,Set
,Iterable
,Iterator
等。 - 这些抽象基类不提供具体实现,而是作为接口描述,帮助开发者定义遵循这些接口的新类。通过继承这些抽象基类,可以确保自定义类具有标准容器类型的基本行为和协议。
- 在较早版本的Python中,一些抽象基类直接在
collections
模块中定义,但在新的组织结构下,为了更好地分离接口和实现,将抽象基类移动到了collections.abc
模块。
- 自Python 3.3开始引入,这个模块定义了多个抽象基类(ABC),用于表示不同类型的容器接口规范,包括但不限于
总结来说,collections
模块提供的是可以直接使用的具体容器数据类型,而collections.abc
模块则提供了抽象基类,用于指导和约束自定义容器类型的开发。尽管在实际导入时,为了向后兼容,即使从collections
模块导入抽象基类也可能有效,但从collections.abc
模块导入更加清晰且符合PEP 3119关于抽象基类的推荐做法。
举例:
-
from collections import Mapping:
- 在Python 3.3之前,
collections
模块直接定义了抽象基类,包括Mapping
。如果你在旧版本的Python中使用这个导入方式,可以直接获取到这个抽象基类。
- 在Python 3.3之前,
-
from collections.abc import Mapping:
- 从Python 3.3开始,为了更好地分离接口和实现,Python引入了
collections.abc
模块来存放所有容器相关的抽象基类。 - 使用这种方式导入
Mapping
,可以确保你在任何Python版本下都能正确地访问映射抽象基类,并且遵循PEP 3119关于抽象基类的最新推荐做法。 - 即使在较新的 Python 版本中,出于向后兼容考虑,
collections
模块内部也对这些抽象基类做了引用,所以from collections import Mapping
仍然有效,但不推荐这样做。
- 从Python 3.3开始,为了更好地分离接口和实现,Python引入了