Skip to main content
 首页 » 编程设计

python之为什么要删除 __init__.py 中的模块

2025年05月04日20lexus

我正在对 PyTorch 源代码进行一些研究。在 this file作者实际上删除了模块。

from .adadelta import Adadelta  # noqa: F401 
from .adagrad import Adagrad  # noqa: F401 
from .adam import Adam  # noqa: F401 
 
del adadelta 
del adagrad 
del adam 

这样做的理由是什么?

请您参考如下方法:

这是一种将功能分解到子模块中而不使子模块成为公共(public) API 的一部分的方法。导入系统的一个怪癖是 this sort of relative import ends up putting the submodules in the parent's namespace ,因此用户可以执行以下操作:

import torch.optim 

然后访问 torch.optim.adadelta 的属性,而无需显式导入 torch.optim.adadelta。虽然一些 Python 内置包以这种方式工作,但它不会被撤消,因为太多人不小心依赖它(例如只 import os 的人,然后使用 os.path API),通常最好避免这种数据泄漏。导入 torch.optim 应该只提供对列出的特定名称的访问,而不保证将自动导入哪些子模块。

通过这样做,人们不会在仅导入 torch.optim 后不小心依赖于能够使用 torch.optim.adadelta,因此开发人员可以自由重构它以移动特定类和其他 API 的实现,而无需特别努力确保 import torch.optim 也导入所有这些子模块,只是为了保留执行不正确/不完整导入的代码的行为。