我正在对 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 也导入所有这些子模块,只是为了保留执行不正确/不完整导入的代码的行为。
