python是否通过多段导入做了额外的工作?

python是否通过多段导入做了额外的工作?,python,python-3.x,python-import,Python,Python 3.x,Python Import,我在一个学生的剧本中看到了以下内容,令我惊讶的是,它居然奏效了: >>> import os.path 简而言之,问题是:这与简单的导入操作系统有何不同?或者除了必须存在os.path之外,它是相同的吗 正如您在下面看到的,它没有在我的范围内定义路径,而是定义操作系统 >>> dir() ['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'os']

我在一个学生的剧本中看到了以下内容,令我惊讶的是,它居然奏效了:

>>> import os.path
简而言之,问题是:这与简单的导入操作系统有何不同?或者除了必须存在
os.path
之外,它是相同的吗

正如您在下面看到的,它没有在我的范围内定义
路径
,而是定义
操作系统

>>> dir()
['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'os']
所以问题是:python如何处理这个问题?当然,它导入(并执行)模块
os
。它还确保
os.path
解析为有效的内容。(感谢@Lee和@Stuart提供的文档链接证实了这一点。)但还有更多吗?或者
import-pkg.submod
是否始终等同于
import-pkg
(前提是
pkg.submod
存在)

如果我导入
os
,它已经导入/执行
os
本身导入的任何模块;因此,
os.path
已加载。是否存在导入
pkg.submod
可能导致不同代码被执行、顺序不同或产生不同副作用的安排(不太奇怪),而不仅仅是导入
pkg
?多段表单是否有合法的使用案例?(换言之:有什么意义?

来自:

[模块的完全限定名称]将用于导入搜索的各个阶段,并且 可以是子模块的点路径,例如
foo.bar.baz
。在这种情况下,, Python首先尝试导入
foo
,然后是
foo.bar
,最后是
foo.bar.baz
。如果任何中间导入失败,则执行
ImportError
这是提高

因此,为了回答您最初的问题,似乎如果
os
是一个有效的包,则导入整个模块。因此,正如您所建议的,子模块表单将用于验证
os.path
是否存在于
os
模块中,而不仅仅是导入模块
os.path

如果您只想导入
路径
模块,则可以使用
from。。。导入…
语法:

>>> from os import path
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'path']

另请参见:

此处有相关文档请注意,
os.path
是一个特例,因为没有该名称的实际子模块
os
本身将
posixpath
ntpath
作为
path
导入,视情况而定。整个模块确实已导入,抱歉,我没有说明我知道这一点。问题是还有什么其他影响。有区别吗?如果我只是导入
os
,它不是已经导入了所有
os
导入的内容,因此也导入了
path
?是的,我想
import os.path
可以用来验证
os
模块中是否存在
path
,否则它会引发
ImportError