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

新手上路,请多包涵

In Python 3.3 “abstract base classes” in collections (like MutableMapping or MutableSequence ) were moved to second-level module collections.abc .所以在 Python 3.3+ 中,实际类型是 collections.abc.MutableMapping 等等。 文档 指出旧的别名(例如 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: ...

原文由 Freddie Chopin 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 739
2 个回答

将它放在脚本的顶部:

 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

原文由 Freddie Chopin 发布,翻译遵循 CC BY-SA 4.0 许可协议

One way to solve this is to simply try to get abc from collections , else assume the members of abc are already in collections .

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

原文由 jvdillon 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题