Python 3.x 从集合导入容器和从集合.abc导入容器之间的差异

Python 3.x 从集合导入容器和从集合.abc导入容器之间的差异,python-3.x,abc,Python 3.x,Abc,我们可以通过两种方式导入容器: 来自集合导入容器 from collections.abc导入容器 帮助函数用于两个容器返回相同的文档 帮助(collections.Container): 帮助(collections.abc.Container): 这两种进口商品有什么区别?为什么我们可以同时做这两件事 更新 从集合导入容器时收到弃用警告(Python 3.7.3) 从python3.8不能直接从集合导入它 >>> from collections import Contai

我们可以通过两种方式导入
容器

  • 来自集合导入容器
  • from collections.abc导入容器
  • 帮助
    函数用于两个
    容器
    返回相同的文档

    帮助(collections.Container)

    帮助(collections.abc.Container)

    这两种进口商品有什么区别?为什么我们可以同时做这两件事

    更新

    集合导入
    容器时收到弃用警告(
    Python 3.7.3

    python3.8
    不能直接从
    集合导入它

    >>> from collections import Container
    
    main:1:不推荐使用警告:不推荐使用“collections”而不是“collections.abc”来使用或导入abc,并且在 3.8它将停止工作

    从:

    在版本3.3中更改:已移动 到 模块。为了向后兼容,它们仍然可见 在本模块中,通过Python 3.7。 随后,它们将被完全移除

    这些“集合抽象基类”目前包括
    AsyncGenerator
    AsyncIterable
    AsyncIterator
    可等待
    Bytestring
    Callable
    Collection
    Container
    corroutine
    生成器
    哈希表
    项目视图
    可编辑
    迭代器
    键视图
    映射
    映射视图
    可变映射
    可变序列
    可变表集
    可逆
    顺序
    设置
    大小
    值视图

    在Python3.8中,从
    集合导入它们将停止工作。
    在Python3.3到3.7中,可以从
    集合
    或 从
    collections.abc
    (它给出了完全相同的类)。 在Python3.7中,从
    集合导入它们将打印
    弃用警告,因为Python 3.8即将发布

    在Python 2中,它们只能从“集合”导入, 不是来自“collections.abc”

    处理此问题的一种简单方法是使用try/except块:

    try:  # works in Python >= 3.3
        from collections.abc import Sequence
    except ImportError:  # Python 2, Python <= 3.2
        from collections import Sequence
    
    此布尔值通常使用
    six
    获得:

    from six import PY2
    
    from six import PY3
    
    或使用系统版本信息

    import sys
    PY2 = int(sys.version_info[0]) == 2
    
    import sys
    PY3 = int(sys.version_info[0]) == 3
    
    如果我们预期Python4可能会像Python3.3一样工作+ 在这方面,Python 2的特殊外壳似乎更适合未来 而不是特殊的套管Python 3,可以按如下方式进行:

    if PY3:
        from collections.abc import Sequence
    else:
        from collections import Sequence
    
    其中,
    PY3
    布尔值可以使用
    six
    获得:

    from six import PY2
    
    from six import PY3
    
    或使用系统版本信息

    import sys
    PY2 = int(sys.version_info[0]) == 2
    
    import sys
    PY3 = int(sys.version_info[0]) == 3
    
    不过,上面的try/except方法似乎更稳健 (例如,它与Python3.2一起工作,无需额外努力)