当前位置: 首页 > 面试题库 >

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

经嘉
2023-03-14
问题内容

在Python
3.3中collections(如MutableMappingMutableSequence)中的“抽象基类”被移至了第二级模块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: ...在需要这种类型的所有地方都使用整个脚本?


问题答案:

将其放在脚本的顶部:

import collections

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

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

另外,也可以在顶部的脚本中导入所需的内容:

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


 类似资料:
  • 问题内容: 如何使用python2.7获取公共IP?不是私有IP。 问题答案: 当前有几种选择: ip.42.pl jsonip.com httpbin.org ipify.org 以下是可以利用上述每种方法的确切方法。 ip.42.pl 这是我找到的第一个选项。对于脚本来说非常方便,您不需要在这里进行JSON解析。 jsonip.com 似乎该域的唯一目的是返回JSON中的IP地址。 httpb

  • 我安装了两个python3.8,其中一个在终端中具有sudo权限时使用,另一个在没有权限时使用: 安装了一个python3.8(我想根据我使用的软件): 和为spyder安装的python3.8 我需要anaconda3/bin/python3.8用于一个项目,但现在我想安装一个我必须自己构建的包到python3.8,我花了几天时间才意识到sudo哪个python3.8和哪个python3.8是不

  • 错误: Traceback(最近一次调用last):文件“E:\ mypython road \ src \ requeststest . py”,第1行,在导入请求文件“C:\ python 27 \ lib \ site-packages \ requests-2 . 3 . 0-py 2.7 . egg \ requests _ _ init _ _”中。py”,第58行,来自。在from中

  • 问题内容: 我刚安装了python 2.7,并且还安装了2.7站点包。 当我得到的版本: 表明: 如何使用位于以下位置的2.7版本的pip: 问题答案: $ PATH变量中的某个位置应安装一个名为“ pip2.7”的二进制文件。 您可以通过键入以下内容找到答案 这应该在您的标准输出上打印“ /usr/local/bin/pip2.7”之类的内容。如果它不打印任何类似内容,则表示未安装。在这种情况下

  • 我的系统正在运行CentOS 6。我没有管理员访问权限,所以sudo不可用。我有Python 2.7.3可用,以及和。我希望我可以使用这些来建立一个新的虚拟环境在其中安装 我尝试了这里描述的方法:在virtualenv中使用python3 但是得到了这个错误: 我的系统还安装了Python 3.4模块,因此我尝试了这一点,但virtualenv似乎无法在那里工作: 这似乎是有道理的,因为只有Pyt

  • 我能够在Java中使用XSLT1.0,如以下示例所示:- copy.xml copy.xsl copy.java 输出

  • editor.fxml,使用: 实际上,我找不到这两种代码有什么不同。我错过什么了吗?

  • 问题内容: 我想创建一个属性字符串,然后将其存储在中,然后再次访问它,并将属性字符串分配给。我该怎么办?提前致谢。 问题答案: 您必须将转换为,然后将其存储在中。