使用__init__.py导入Python子模块

使用__init__.py导入Python子模块,第1张

使用__init__.py导入Python子模块

您可能已经了解,当您导入 模块时
,解释器会创建一个新的名称空间,并使用新的名称空间作为本地和全局名称空间来执行该模块的代码。代码完成执行后,模块名称(或任何子

as
句中提供的名称)将绑定到刚在导入名称空间中创建并记录在其
__name__
in中的模块对象
sys.modules

package.subpackage.module
导入诸如的限定名称时,名字(
package
)导入本地名称空间,然后
subpackage
导入
package
的名称空间,最后
module
导入
package.subpackage
的名称空间。使用
from... import ... as...
进行导入的 *** 作顺序相同,但是导入的对象直接绑定到导入模块名称空间中的名称。包名称未绑定在本地名称空间中这一事实并不意味着它尚未导入(如对的检查
sys.modules
所示)。

__init__.py
软件包中的in与模块
.py
文件具有相同的功能。具有结构的
被写为目录,其中还可以包含任何sub_packages的模块(常规
.py
文件)和子目录(也包含
__init__.py
文件)。导入程序包时,将创建一个新的名称空间,并
__init__.py
使用该名称空间作为本地和全局名称空间来执行程序包的名称空间。因此,为回答您的问题,我们可以通过省略顶层软件包来删除文件存储,而顶层软件包
test.py
在程序运行时将永远不会被其考虑。然后看起来像这样:

test.pysubpackage/    __init__.py    hello_world.py

现在,

subpackage
不再是子包,因为我们已删除了不相关的包含包。专注于为什么
do_something
未定义名称可能会有所帮助。
test.py
不包含任何导入,因此目前尚不清楚您期望
do_something
如何获得意义。您可以通过使用空白使其工作
subpackage/__init__.py
,然后
test.py
读取

from subpackage.hello_world import do_somethingdo_something()

另外,您可以我们

subpackage/__init__.py
读取

from hello_world import do_something

当导入包时,它将

do_something
subpackage
名称空间内建立函数。然后使用
test.py
从包中导入功能的,如下所示:

from subpackage import do_somethingdo_something()

最后一个相同的选择

__init__.py
是使用
test.py
简单地导入(sub)包的a,然后使用相对命名来访问所需的功能:

import subpackagesubpackage.do_something()

在您的本地名称空间中访问它

空着

__init__.py
也可以通过
test.py
阅读来实现

import subpackage.hello_worldsubpackage.hello_world.do_something()

甚至

from subpackage.hello_world import do_somethingdo_something()

如果为空,

__init__.py
则意味着顶级程序包名称空间将仅包含程序导入的任何子程序包的名称,这使您仅可以导入所需的子程序包。该文件确定顶级程序包的名称空间。

尽管完全可以在中定义类和函数,但

__init__.py
更常见的方法是从子模块将内容导入该命名空间,以便导入者只需导入顶级包即可使用单级属性引用来访问其内容,甚至
from
只用于导入您想要的名称。

最终,使您保持直觉的最佳工具是清楚了解导入的工作方式及其各种形式对导入名称空间的影响。



欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/zaji/5630726.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存