为什么导入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中导入模块或程序包是一个概念上简单的操作:
import foo.bar.baz
有两个级别),找到相应的\uuuu init\uuuuuuuuuuupy
文件并执行它。执行它只意味着运行文件中的所有顶级语句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
都是空的,所有这些导入都可以工作。请再看