python多段导入会做些额外的事情吗?
作者:互联网
我在一个学生的脚本中看到了以下内容,令我惊讶的是它起作用了:
>>> import os.path
简而言之,问题是:这与简单的import os有何不同?还是一样,除了必须存在os.path?
正如您在下面看到的,它不是在我的范围内定义路径,而是在os中.
>>> 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相比,导入pkg.submod可能导致执行不同的代码,执行的代码不同或顺序不同,或者产生不同的副作用?多段表单有合法的用例吗? (换句话说:有什么意义?)
解决方法:
从docs开始:
[The fully qualified name of the module] will be used in various phases of the import search, and it
may be the dotted path to a submodule, e.g.foo.bar.baz
. In this case,
Python first tries to importfoo
, thenfoo.bar
, and finally
foo.bar.baz
. If any of the intermediate imports fail, anImportError
is raised.
因此,要回答您的原始问题,似乎如果os是一个有效的程序包,则整个模块都将被导入.因此,正如您所建议的,子模块形式将用于验证os.path是否存在于os模块中,而不仅仅是导入模块os.path.
如果只想导入路径模块,则可以使用from … import …语法:
>>> from os import path
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'path']
另请参阅:from … import
vs import .
标签:python-3-x,python-import,python 来源: https://codeday.me/bug/20191118/2029542.html