联系我们大型铝电解电容小微型铝电解电容贴片铝电解电容器聚合物铝电解电容器

品质诚信服务

当前位置:首页 >> 产品和行业资讯 >> 云计算开发研究笔记:如何从包中导入Python3 *

云计算开发研究笔记:如何从包中导入Python3 *

想象一下,如果我们使用sound.effects import *,会发生什么? Python将进入文件系统,找到此程序包中的所有子模块,并将它们一个接一个地导入。

不幸的是,由于Windows是不区分大小写的系统,因此该方法在Windows平台上无法很好地工作。

在这种平台上,没有人可以保证是否将名为ECHO.py的文件作为模块echo,Echo甚至ECHO导入。

(例如,Windows 95烦人的将每个文件的首字母大写),并且DOS的8 + 3命名规则处理长模块名,这使问题更加棘手。

为了解决这个问题,我只能麻烦软件包作者提供准确的软件包索引。

import声明遵循以下规则:如果在包定义文件__init__.py中有一个名为__all__的列表变量,则在从包import *使用时,此列表中的所有名称都将作为包内容导入。

作为软件包的作者,请不要忘记确保在更新软件包后也更新了__all__。

您说我不这样做,我不使用import *,嗯,没问题,谁让您当老板。

这是一个示例,其中包含以下代码:file:sounds / effects / __ init__.py:这意味着,当您从sound.effects import *使用时,您只会在包中导入这三个子模块。

如果确实未定义__all__,则使用sound.effects import *中的语法时,包sound.effects中的所有子模块都不会被导入。

他只导入了sound.effects包及其中定义的所有内容(也许运行__init__.py中定义的初始化代码)。

这将导入__init__.py中定义的所有名称。

而且他不会销毁我们在这句话之前导入的所有明确指定的模块。

看一下代码的这一部分:在此示例中,在从... import执行之前,sound.effect包中的echo和Surround模块已导入到当前名称空间中。

(当然,如果定义了__all__,那不会有问题。

)通常,我们不提倡使用*此方法导入模块,因为此方法通常会导致代码可读性降低。

但是,这确实节省了大量按键操作,并且某些模块被设计为只能通过特定方法导入。

请记住,使用“程序包导入” import specific_submodule绝对不会出错。

实际上,这也是推荐的方法。

除非要导入的子模块的名称可能与其他软件包的子模块的名称相同。

如果包是结构中的子包(例如本示例中的包声音),并且您要导入同级包(同一级别的包),则必须使用导入绝对路径来导入它。

例如,如果模块sound.filters.vocoder要在包sound.effects中使用模块echo,则必须从sound.effects导入import echo编写。

隐式和显式相对导入都从当前模块开始。

主模块的名称始终为“ __main__”。

Python应用程序的主模块应始终由绝对路径引用。

该程序包还提供了一个附加属性__path__。

这是目录列表。

每个包含的目录对此包都有__init__.py。

您必须先定义它,然后再执行其他__init__.py。

可以修改此变量以影响包中包含的模块和子包。

此功能不常用,通常用于扩展包装中的模块。