包中的Python导入功能

时间:2017-12-23 02:41:34

标签: python python-3.x package python-import

(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

非常感谢你是否有人清楚我的怀疑。

2 个答案:

答案 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__.pysubmodule.py,后者包含一个只打印“This is submodule”的函数。

现在,当你致电import subpackage时,你打电话并“拉”“subpackage”中的所有,包括子模块,因此,{{1功能。 当你写subfunc()时,真的没有什么了不起的,你只需要调用mainfolder / container (subpackage。),然后调用.py文件(子模块。)最后函数本身(subfunc())