You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Python中from XX import *在自定义文件和PyTorch等库的导入效果不同?

导入行为差异的核心原因

这个差异完全是Pythonfrom 模块 import *语法的内置规则导致的,和PyTorch本身没有特殊关系:

  • 当你使用from xxx import *导入模块内容时,Python会先检查目标模块是否定义了名为__all__的列表:
    1. 如果存在__all__,只会导入该列表里明确列出的变量、类、函数名称,不在列表里的成员不会被导入到当前命名空间
    2. 如果不存在__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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 04:45:04