Python多层级模块导入方式疑问及相关文档咨询
Python模块导入问题解答
关于import torch和from torch import nn的拆分原因
你提到的from torch import torch.nn是错误写法,这两行导入的作用完全不同:
import torch:将整个torch包导入当前命名空间,之后需通过torch.xxx的形式访问包内子模块或对象(比如torch.tensor()、torch.nn.Linear())。from torch import nn:直接将torch包下的nn子模块导入当前命名空间,之后可直接用nn.xxx访问(比如nn.Linear()),无需前缀torch.。
拆分两行的常见原因是代码中既需要用到torch包本身的核心功能(如张量创建、设备配置),又需要频繁使用nn子模块的内容(如网络层定义),这种导入方式能平衡代码简洁性和可读性。
Python二级子模块的理解
Python的包(Package)是包含__init__.py文件的目录,子模块可以是包目录下的.py文件,或者嵌套的子目录(子包):
- 导入父包时,Python默认不会自动加载其所有子模块。比如
import torch后,torch.nn并不会被自动导入,必须显式执行import torch.nn或from torch import nn才能使用该子模块。这是Python的设计逻辑——避免不必要的内存占用,加快导入速度。 - 子模块的可见性由包内的
__init__.py文件控制,有些包会在__init__.py中预先导入常用子模块,让用户导入父包后就能直接访问,但这是包开发者的选择,并非Python的默认行为。
三级及以上层级模块的处理方式
对于多级嵌套的模块(比如sklearn.metrics.r2_score是三级结构:sklearn包 → metrics子包 → r2_score函数),常见的导入方式有以下几种:
- 全路径导入:
import sklearn.metrics.r2_score,调用时需写全路径:sklearn.metrics.r2_score(y_true, y_pred) - 导入子包后访问:
import sklearn.metrics,调用时使用sklearn.metrics.r2_score(...) - 直接导入目标对象:
from sklearn.metrics import r2_score,调用时直接写r2_score(...) - 多级批量导入:
from sklearn.metrics import r2_score, mean_squared_error,一次性导入多个目标对象;或者from sklearn import metrics,之后通过metrics.r2_score(...)访问
内容的提问来源于stack exchange,提问作者DDave
相关产品推荐
相关产品推荐

