【问题标题】:Python import function from package从包中导入Python函数
【发布时间】:2018-06-05 13:39:51
【问题描述】:

(Python 3.6)

我有这个文件夹结构:

package/
       start.py
       subpackage/
                 __init__.py
                 submodule.py

submodule.py:

def subfunc():
    print("This is submodule")

__ 初始化 __.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 __.pystart.py

中都没有

如果有人能解开我的疑问,非常感谢。

【问题讨论】:

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


    【解决方案1】:

    在发出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__())加载子模块时,将在父模块的命名空间中放置与子模块对象的绑定。


    【讨论】:

    • 你好georgexsh。我没有在 "__ init .py" 和 "start.py" 中完成 "import subpackage.submodule" 。我将“subfunc()”导入“__init __.py”的命名空间,然后通过将“subpackage”导入“start.py”将“__init __.py”的内容导入start。 " init __" 中的 "func()" 应该是与 "submodule" 中的不同的对象。这是我的疑问。我错了吗?
    【解决方案2】:

    如果我没看错的话,你有一个名为“package”的文件夹,其中有 2 个东西:一个 .py 文件和另一个名为“subpackage”的文件夹。

    在“子包”中,您有 __init__.pysubmodule.py,后者包含一个仅打印“这是子模块”的函数。

    现在,当您调用 import subpackage 时,您调用并“拉取”“subpackage” 内的所有内容,包括子模块,因此也包括 subfunc() 函数。 当您编写 subpackage.submodule.subfunc() 时,并没有什么了不起的地方,您只需调用主文件夹/容器 (subpackage.),然后调用 .py 文件 (submodule.),最后调用函数本身 (subfunc() ).

    【讨论】:

    • 你好罗林。你的结构是正确的。但这是个问题:
    • 你好罗林。你的结构是正确的。这是疑问:在“init.py”文件中,“subfuc()”函数被导入命名空间,这使得它可以直接访问,但不能通过点符号引用它(因为它们是2 个不同的对象)。当我将包“子包”导入 start.py 时,“start.py”可以访问子包的 init 文件的内容。 “start.py”中的“subpackage.submodule.subfunc()”语句正在访问“submodule.py”中的“func()”,由于“submodule.py”没有导入到“start”中,因此它不应该被访问。 “初始化”。
    • 伙计,你在纠结这个简单的问题 ;) 问题是,当你在 start.py 中导入 subpackage 时, _init_.py 在子包中告诉start.py submodule.py 里面是什么,所以它基本上充当start.py 的索引。尝试评论 __init__.py 中的所有内容,然后执行 start 以了解我的意思。
    • Rolin,谢谢你的遮阳篷。但我不认为你理解我的问题。当我只导入一个包时,它的 init 文件的内容在导入包的脚本中执行。如果 init 的内容(如我的示例)只是从模块中导入对象,如 "from module import function object" ,则只有函数对象应该可以访问 init 以及导入 init 内容的脚本。函数对象所属的整个模块不应该是可访问的。这是我的疑问。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-05
    • 2022-11-11
    相关资源
    最近更新 更多