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

Rex*_*Low 1 python python-import

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

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

del adadelta
del adagrad
del adam
Run Code Online (Sandbox Code Playgroud)

这样做的理由是什么?

Sha*_*ger 5

这是将功能分解为子模块的一种方式,而无需使子模块成为公共API的一部分。导入系统的一个怪癖是,这种相对导入最终会将子模块放在父级的命名空间中,因此用户可以执行以下操作:

import torch.optim
Run Code Online (Sandbox Code Playgroud)

然后通过访问的属性进行访问,torch.optim.adadelta而无需显式导入torch.optim.adadelta。尽管某些Python内置程序包以这种方式工作,并且不会被撤消,因为有太多人无意中依赖它(例如,只import os使用os.pathAPI的人,然后才使用API),通常最好避免这种数据泄漏。导入torch.optim仅应提供对列出的特定名称的访问权限,而不能保证将自动导入哪些子模块。

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