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

为什么导入python模块不导入嵌套模块?,python,python-module,Python,Python Module,如果我这样做: import lxml 在python中,不会导入lxml.html。例如,我不能调用lxml.html.parse()函数。为什么会这样?这是为了只允许为多部分库加载最小数量的代码,而您可能不会使用整个库。例如,您可能没有使用lxml的html部分,因此不需要处理加载其代码的问题。lxml是一个包,而不是一个模块。包是模块的集合。实际上,您也可以直接导入包,但这不会自动导入其所有子模块 至于为什么会这样,这是BDFL的一个问题。我认为这可能是因为包通常相当大,而导入所有子模

如果我这样做:

import lxml 

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

这是为了只允许为多部分库加载最小数量的代码,而您可能不会使用整个库。例如,您可能没有使用
lxml
html
部分,因此不需要处理加载其代码的问题。

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


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

lxml
在Python中被称为a,它是模块的分层集合。包裹可能是巨大的,所以他们被允许在进口时对拉入的东西进行选择。否则,每个人都必须导入完整的层次结构,这将相当浪费资源。

这是出于设计。包可以选择在其
\uuuu init\uuuuuuupy.py
中导入嵌套包,然后您就可以毫无问题地访问嵌套包。这是程序包编写者的选择问题,目的是尽量减少可能不使用的代码量。

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

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

  • 对于导入中的每个目录级别(
    import foo.bar.baz
    有两个级别),找到相应的
    \uuuu init\uuuuuuuuuuupy
    文件并执行它。执行它只意味着运行文件中的所有顶级语句

  • 最后,执行.py文件本身(本例中为
    foo/bar/baz.py
    ),这意味着执行所有顶级语句。由于该执行而创建的所有全局对象都绑定到一个模块对象中,该模块对象就是导入的结果


  • 如果这些步骤都没有导入子包,则这些子包不可用。如果它们确实导入了子包,那么它们是可用的。包作者可以随心所欲。

    您可能会注意到,
    import os
    允许您在代码中使用
    os.path.任何内容。因此,这取决于模块作者。我认为有必要澄清一下,在导入包时,在步骤1中找到的.py文件是包的uuu init_uuuuu.py。除非子包被导入到该_init__u;.py文件中,否则它们将不可用。foo.bar import baz的
    不受此规则的约束吗?至少就我的项目而言,即使所有的
    \uuu init\uuuu.py
    都是空的,所有这些导入都可以工作。请再看