小编典典
您可能已经了解,当您导入 模块时
,解释器会创建一个新的名称空间,并使用新的名称空间作为本地和全局名称空间来执行该模块的代码。代码完成执行后,模块名称(或任何子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.py
subpackage/
__init__.py
hello_world.py
现在,subpackage不再是子包,因为我们已删除了不相关的包含包。专注于为什么do_something未定义名称可能会有所帮助。test.py不包含任何导