当我在包中导入子包时,我可以依赖父包也被导入的事实吗?
e.g。这工作
python -c "import os.path; print os.getcwd()"
我不应该明确import os
os.getcwd
可用吗?
答案 0 :(得分:8)
关于包有一个重要的事情,就是加载和可用之间存在差异。
使用import a
加载模块a
(可以是一个包)并以名称a
提供。
使用from a import b
加载模块a
(肯定是一个包),然后加载模块a.b
并使仅使用名称{{ 1}}。请注意,b
也在进程中被加载,因此任何初始化都应该发生。
使用a
,您同时加载两者并使两者都可用(名称为import a.b
和a
)。
答案 1 :(得分:5)
这是一个很好的问题。如果您查看os.py
的源代码,可以找到以下行:
sys.modules['os.path'] = path
所以这是我们的模块。但是path
是什么?那取决于你的操作系统。对于Windows,它在此块中定义:
elif 'nt' in _names:
name = 'nt'
linesep = '\r\n'
from nt import *
try:
from nt import _exit
except ImportError:
pass
import ntpath as path
import nt
__all__.extend(_get_exports_list(nt))
del nt
基本上,os.path
在这种情况下很特殊。
简短版本:Python在幕后做了一些事情来制作os.path
。您可能不应该依赖它来获取其他模块。 “明确比隐含更好”是禅的方式。
答案 2 :(得分:2)
它有效且可靠。当你做
时,幕后发生了什么import os.path
然后导入os
,然后导入os.path
。
答案 3 :(得分:1)
是的,你可以依靠它始终工作。 Python必须在os
的命名空间中包含os.path
才能工作。
使用from os import path
表示法不起作用。在这种情况下,os模块不进入命名空间,只有path
。