为什么导入python模块不导入嵌套模块?

时间:2012-02-15 23:25:58

标签: python python-module

如果我这样做:

import lxml 

在python中,lxml.html未导入。例如,我无法调用lxml.html.parse()函数。为什么会这样?

5 个答案:

答案 0 :(得分:12)

在Python中导入模块或包是一个概念上简单的操作:

  1. 找到与导入相对应的.py文件。这涉及Python路径和其他一些机制,但会导致找到特定的.py文件。

  2. 对于导入中的每个目录级别(import foo.bar.baz有两个级别),找到相应的__init__.py文件,然后执行它。执行它只是意味着运行文件中的所有顶级语句。

  3. 最后,执行.py文件本身(本例中为foo/bar/baz.py),这意味着将执行所有顶级语句。作为执行结果创建的所有全局变量都捆绑到模块对象中,该模块对象是导入的结果。

  4. 如果这些步骤都没有导入子包,则这些子包不可用。如果他们确实导入了子包,那么它们就可用了。包装作者可以按照自己的意愿行事。

答案 1 :(得分:6)

lxml在Python中称为package,它是模块的分层集合。软件包可能很大,因此允许它们选择导入时的内容。否则,每个人都必须导入完整的层次结构,这将浪费资源。

答案 2 :(得分:4)

这是设计的。该包具有在其__init__.py中导入嵌套包的选项,然后,您将能够毫无问题地访问嵌套包。这是包编写器的选择问题,目的是最小化您可能不会使用的代码量。

答案 3 :(得分:2)

lxml是一个包,而不是一个模块。包是模块的集合。实际上,您也可以直接导入包,但不会自动导入其所有子模块。

关于为什么这是,这是BDFL的一个问题。我认为这可能是因为软件包通常非常大,导入所有子模块会对性能造成过大的损失。

答案 4 :(得分:1)

这是为了允许只为最不可能使用的多部分库加载最少量的代码。例如,您可能没有使用html的{​​{1}}部分,因此不想处理加载其代码。