如何在Python 3.8+和Python 2.7中使用collections.abc

时间:2018-12-30 14:42:23

标签: python python-3.x python-2.7

在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: ...

4 个答案:

答案 0 :(得分:7)

将其放在脚本顶部:

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

答案 1 :(得分:0)

好像six模块的新版本具有collections_abc别名,因此您可以使用:

from six.moves import collections_abc

答案 2 :(得分:0)

解决此问题的一种方法是简单地尝试从abc获取collections,否则假设abc的成员已经在collections中。

import collections                                         
collections_abc = getattr(collections, 'abc', collections)

答案 3 :(得分:0)

我遇到这样的错误:

C:\Users\gsc-30431\Anaconda3\lib\site-packages\unittest2\compatibility.py:148
  C:\Users\gsc-30431\Anaconda3\lib\site-packages\unittest2\compatibility.py:148: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is depr
ecated since Python 3.3,and in 3.9 it will stop working
    class ChainMap(collections.MutableMapping):

-- Docs: https://docs.pytest.org/en/latest/warnings.html

enter image description here

因此,我通过访问上面的错误中显示的路径来打开文件Compatibility.py!并在其中搜索了使用此Collections包的代码,并更改了前一行,即:

class ChainMap(collections.MutableMapping):

到新行:

class ChainMap(collections.abc.MutableMapping):

截屏: enter image description here

只需添加.abc即可解决我的问题,并且我不再收到警告!