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

时间:2019-08-01 02:51:59

标签: python python-import

我正在对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

这样做的理由是什么?

1 个答案:

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