为何Python中from XX import *在自定义文件和PyTorch等库的导入效果不同?
导入行为差异的核心原因
这个差异完全是Pythonfrom 模块 import *语法的内置规则导致的,和PyTorch本身没有特殊关系:
- 当你使用
from xxx import *导入模块内容时,Python会先检查目标模块是否定义了名为__all__的列表:- 如果存在
__all__,只会导入该列表里明确列出的变量、类、函数名称,不在列表里的成员不会被导入到当前命名空间 - 如果不存在
__all__,才会默认导入所有名称不以单下划线开头的全局成员
- 如果存在
对应场景解释
1. torchvision.models.vgg模块的情况
官方的vgg模块源码里明确定义了__all__列表,里面只放了对外公开的模型构造函数(比如vgg16_bn、vgg19等),cfgs、make_layers属于模块内部的辅助实现变量和函数,没有被加入到__all__里,所以用*导入的时候不会被带进来。
但这两个成员本身不是私有成员(名称没有下划线开头),所以你显式指定名称导入from torchvision.models.vgg import cfgs, make_layers是可以正常使用的。
你可以用以下代码验证这个逻辑:
import torchvision.models.vgg print(torchvision.models.vgg.__all__) # 输出结果仅包含vgg系列模型函数名,没有cfgs、make_layers
2. 自定义模块b.py的情况
你自己写的b.py没有定义__all__列表,所以from b import *会默认导入所有非下划线开头的全局成员,也就是你写的url变量和a函数,自然可以正常使用。
额外说明
PyTorch官方这么设计的目的是避免*导入时污染用户的命名空间,只有稳定的对外公开API才会被加入__all__列表。cfgs和make_layers不属于公开API的一部分,未来版本可能会调整实现甚至删除,生产环境如果要长期使用建议自己实现对应逻辑,避免后续版本升级出现兼容性问题。
内容的提问来源于stack exchange,提问作者Darcy
相关产品推荐
相关产品推荐

