如何使用Python3.8+和Python2.7中的collections.abc

2024-06-16 13:19:56 发布

您现在位置:Python中文网/ 问答频道 /正文

在Python 3.3中,collections(如MutableMappingMutableSequence)中的“抽象基类”被移到二级模块collections.abc。所以在Python 3.3+中,真正的类型是collections.abc.MutableMapping等等。Documentation声明旧别名(例如collections.MutableMapping)将在Python 3.7(当前是最新版本)之前可用,但是在3.8中这些别名将被删除。

当前版本的Python 3.7在使用别名时甚至会发出警告:

./scripts/generateBoard.py:145: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working
  elif isinstance(value, (collections.MutableMapping, collections.MutableSequence)) == True:

在python 2.7中没有collections.abc

当Python脚本打算与(几乎)任何Python版本一起使用时,它如何以最方便的方式处理这种差异?我正在寻找一种解决方案,它可以理想地解决一个中心位置的混乱,而不必在任何需要这种类型的地方使用try: ... except: ...覆盖整个脚本?


Tags: 模块from版本脚本声明警告类型documentation
1条回答
网友
1楼 · 发布于 2024-06-16 13:19:56

将此置于脚本顶部:

import collections

try:
    collectionsAbc = collections.abc
except AttributeError:
    collectionsAbc = collections

然后更改抽象基类型的所有前缀,例如将collections.abc.MutableMappingcollections.MutableMapping更改为collectionsAbc.MutableMapping

或者,在一个地方导入脚本顶部所需的内容:

try:
    from collections.abc import Callable  # noqa
except ImportError:
    from collections import Callable  # noqa

相关问题 更多 >