在Python 3.3中,collections
中的“抽象基类”(例如MutableMapping
或MutableSequence
)已移至第二级模块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: ...
?
答案 0 :(得分:7)
将其放在脚本顶部:
import collections
try:
collectionsAbc = collections.abc
except AttributeError:
collectionsAbc = collections
然后更改抽象基本类型的所有前缀,例如将collections.abc.MutableMapping
或collections.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
因此,我通过访问上面的错误中显示的路径来打开文件Compatibility.py
!并在其中搜索了使用此Collections包的代码,并更改了前一行,即:
class ChainMap(collections.MutableMapping):
到新行:
class ChainMap(collections.abc.MutableMapping):
只需添加.abc即可解决我的问题,并且我不再收到警告!