`from six.moves import urllib`在Python中做什么?

时间:2016-01-25 09:36:31

标签: python

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

from six.moves import urllib

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

这是吗?这是如何定义的?

更新

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

1 个答案:

答案 0 :(得分:36)

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模块,而是黑客的版本。