Python中import *导入行为与前置子模块导入的关联咨询
Python包
import *与子模块导入的行为解析 是的,如果没有提前执行import sound.effects.echo和import sound.effects.surround,这两个子模块不会被from sound.effects import *导入。
核心规则说明
Python中,使用import *导入包时,默认行为遵循以下逻辑:
- 如果包的
__init__.py文件定义了__all__列表,import *只会导入列表中指定的名字(通常是子模块名或包内定义的对象); - 如果没有
__all__,import *只会导入__init__.py中定义的、不以下划线_开头的名字,不会自动递归加载并导入所有子模块。
前置导入语句的作用
当你显式执行import sound.effects.echo和import sound.effects.surround后:
- 这两个子模块会被实际加载到内存中;
- 它们会被注册为
sound.effects包的属性(即可以通过sound.effects.echo访问到该子模块); - 此时再执行
from sound.effects import *,就会把这些已经被加载到包命名空间里的子模块也纳入导入范围,也就是教程里提到的“包括之前import语句显式加载的包的任何子模块”。
简单说,前置导入相当于提前把子模块“挂载”到了父包的命名空间中,让import *能识别并导入它们。
内容的提问来源于stack exchange,提问作者rish
相关产品推荐
相关产品推荐

