我正在对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
这样做的理由是什么?
答案 0 :(得分:5)
这是将功能分解为子模块的一种方法,而无需使子模块成为公共API的一部分。导入系统的一个怪癖是this sort of relative import ends up putting the submodules in the parent's namespace,因此用户可以执行以下操作:
IATA = AH
ICAO = DAH
Callsign = AIR ALGERIE
{'IATA': 'AH', 'ICAO': 'DAH', 'Callsign': 'AIR ALGERIE'}
然后通过访问import torch.optim
的属性进行跟踪,而无需显式导入torch.optim.adadelta
。虽然某些Python内置程序包可以这种方式工作,但由于许多人无意间依赖它(例如只使用torch.optim.adadelta
然后使用import os
API的人),因此它不会被撤消。最好避免这种数据泄漏。导入os.path
仅应提供对列出的特定名称的访问权限,而不能保证将自动导入哪些子模块。
通过这样做,人们不会意外地仅导入torch.optim
后就可以使用torch.optim.adadelta
,因此开发人员可以自由地重构它以移动特定类和其他类的实现。周围的API无需付出特别的努力来确保torch.optim
也会导入所有这些子模块,只是为了保留执行不正确/不完整导入的代码中的行为。