为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

呼如林 2021-09-28 20:54:58
在 Python 3.3 中collections(如MutableMapping或MutableSequence)中的“抽象基类”被移至二级模块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: ...在我需要这种类型的任何地方使用整个脚本?
查看完整描述

3 回答

?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

把它放在脚本的顶部:


import collections


try:

    collectionsAbc = collections.abc

except AttributeError:

    collectionsAbc = collections

然后更改抽象基类型的所有前缀,例如 changecollections.abc.MutableMapping或collections.MutableMappingto collectionsAbc.MutableMapping。


或者,在单个位置的顶部脚本中导入您需要的内容:


try:

    from collections.abc import Callable  # noqa

except ImportError:

    from collections import Callable  # noqa


查看完整回答
反对 回复 2021-09-28
?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

看起来六个模块的新版本都有collections_abc别名,因此您可以使用:

from six.moves import collections_abc


查看完整回答
反对 回复 2021-09-28
  • 3 回答
  • 0 关注
  • 273 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信