您可能已经了解,当您导入 模块时
,解释器会创建一个新的名称空间,并使用新的名称空间作为本地和全局名称空间来执行该模块的代码。代码完成执行后,模块名称(或任何子
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只用于导入您想要的名称。
最终,使您保持直觉的最佳工具是清楚了解导入的工作方式及其各种形式对导入名称空间的影响。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)