如果我这样做:
import lxml
在python中,lxml.html
未导入。例如,我无法调用lxml.html.parse()
函数。为什么会这样?
答案 0 :(得分:12)
在Python中导入模块或包是一个概念上简单的操作:
找到与导入相对应的.py文件。这涉及Python路径和其他一些机制,但会导致找到特定的.py文件。
对于导入中的每个目录级别(import foo.bar.baz
有两个级别),找到相应的__init__.py
文件,然后执行它。执行它只是意味着运行文件中的所有顶级语句。
最后,执行.py文件本身(本例中为foo/bar/baz.py
),这意味着将执行所有顶级语句。作为执行结果创建的所有全局变量都捆绑到模块对象中,该模块对象是导入的结果。
如果这些步骤都没有导入子包,则这些子包不可用。如果他们确实导入了子包,那么它们就可用了。包装作者可以按照自己的意愿行事。
答案 1 :(得分:6)
lxml
在Python中称为package,它是模块的分层集合。软件包可能很大,因此允许它们选择导入时的内容。否则,每个人都必须导入完整的层次结构,这将浪费资源。
答案 2 :(得分:4)
这是设计的。该包具有在其__init__.py
中导入嵌套包的选项,然后,您将能够毫无问题地访问嵌套包。这是包编写器的选择问题,目的是最小化您可能不会使用的代码量。
答案 3 :(得分:2)
lxml
是一个包,而不是一个模块。包是模块的集合。实际上,您也可以直接导入包,但不会自动导入其所有子模块。
关于为什么这是,这是BDFL的一个问题。我认为这可能是因为软件包通常非常大,导入所有子模块会对性能造成过大的损失。
答案 4 :(得分:1)
这是为了允许只为最不可能使用的多部分库加载最少量的代码。例如,您可能没有使用html
的{{1}}部分,因此不想处理加载其代码。