【问题标题】:What does `from six.moves import urllib` do in Python?`from Six.moves import urllib` 在 Python 中有什么作用?
【发布时间】:2016-01-25 09:36:31
【问题描述】:

我在 Python 代码中找到了以下行:

from six.moves import urllib

同时,我可以在任何地方找到urllib.py。我发现包根中有一个文件six.py,里面有class Module_six_moves_urllib(types.ModuleType):

是这个吗?这是怎么定义的?

更新

对不起,我是 Python 新手,问题是关于 Python 语法的。我了解到,import 之后是没有 py 扩展名的 Python 文件名。那么,这种情况下这个文件在哪里呢?

【问题讨论】:

  • 你问six.moves.urllib是干什么用的?你读过说明书吗? pythonhosted.org/six/#module-six.moves - 或者你想知道它是如何实现的(在这种情况下,源代码可用......)?

标签: python


【解决方案1】:

six 是一个帮助编写与 Python 2 和 Python 3 兼容的代码的包。

开发人员在为 Python2 和 3 编写代码时面临的一个问题是标准库中的几个模块的名称发生了变化,尽管功能保持不变。

six.moves 模块以通用名称为 Python2 和 3 提供这些模块(主要是通过以 Python 3 模块的名称提供 Python2 模块)。

所以你的台词

from six.moves import urllib

在使用 Python3 运行时导入 urllib,并使用 Python2 导入 urlliburllib2urlparse 的混合体,模仿 Python3 的 urllib 的结构。另见here

编辑以解决问题的更新:

TLDR;在这种情况下,导入的模块urllib 和文件系统上的文件之间不一定有直接关系。相关文件正是six.__file__ 指向的内容。

第三方模块定义在一个文件/目录中 在sys.path 中列出。大多数情况下,您可以通过检查相关模块的__file__ 属性来找到导入模块的文件的名称,例如six.__file__。然而对于six.moves,事情就没有那么简单了,正是因为暴露的模块实际上可能不会一对一地映射到实际的 Python 模块,而是这些模块的黑客版本。

【讨论】:

    猜你喜欢
    • 2022-12-22
    • 2020-01-06
    • 2017-04-11
    • 2019-06-07
    • 2017-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-09
    相关资源
    最近更新 更多