(Python 3.6)
我有这个文件夹结构:
package/
start.py
subpackage/
__init__.py
submodule.py
submodule.py:
def subfunc():
print("This is submodule")
__ init __。py:
from subpackage.submodule import subfunc
start.py:
import subpackage
subpackage.subfunc()
subpackage.submodule.subfunc()
我明白了如何以及为什么
subpackage.subfunc()
作品。
但我不明白为什么:
subpackage.submodule.subfunc()
如果我没有这样做,也有效:
from subpackage import submodule
也:
import subpackage.submodule
无论是 __ init __。py 还是 start.py
非常感谢你是否有人清楚我的怀疑。
答案 0 :(得分:2)
当发出from subpackage.submodule import subfunc
时,python为你做two things:一,搜索并评估名为subpackage.submodule
的模块,将其放入sys.modules
缓存;二,填充subpackage.submodule.subfunc
对象并绑定名称" subfunc"到当前模块的命名空间:
import语句结合了两个操作;它搜索命名模块,然后将搜索结果绑定到本地范围内的名称。
导入subpackage.submodule
时,submodule
的父级也已导入:
虽然可能会出现某些副作用,例如导入父包,以及更新各种缓存(包括sys.modules)......
在导入subpackage.submodule
的最后阶段,python会在其父subpackage
上设置模块as an attribute,此行为为documented:
当使用任何机制(例如importlib API,import或import-from语句或内置__import __())加载子模块时,绑定将被放置在父模块的命名空间中,直到子模块对象。
答案 1 :(得分:0)
如果我说得对,你有一个名为“package”的文件夹,里面有2个的东西:一个.py文件和另一个名为“subpackage”的文件夹。
在“subpackage”里面你有__init__.py
和submodule.py
,后者包含一个只打印“This is submodule”的函数。
现在,当你致电import subpackage
时,你打电话并“拉”“subpackage”中的所有,包括子模块,因此,{{1功能。
当你写subfunc()
时,真的没有什么了不起的,你只需要调用mainfolder / container (subpackage。),然后调用.py文件(子模块。)最后函数本身(subfunc())。