使导入的模块对其他模块私有
Make imported modules private to other modules
假设我在模块 a.py
中有这样的代码
import numpy as np
def sqrt(x):
return np.sqrt(x)
我有一个模块 b.py
是这样写的:
import a
print(a.sqrt(25))
print(a.np.sqrt(25))
我会看到代码运行良好,并且在大多数 IDE 中使用自动完成时,我发现 a.np
是可访问的。我想将 a.np
设为私有,这样只有 a
代码才能看到该变量。
我不希望 b
能够访问 a.np
.
实现这一目标的好方法是什么?
为什么我希望 a.np
无法访问?因为当我在 Jupyter Lab 中键入 a.
并按 Tab 时,我不希望它显示在自动完成中。它隐藏了模块可以做什么,因为我在我的模块中使用了太多导入。
解决方案与 class 中的 "protected" 属性/方法相同(模块中定义的名称实际上 - 在运行时 - 模块对象的属性):在这些名称前加上一个前导下划线,即
import numpy as _np
def sqrt(x):
return _np.sqrt(x)
请注意,这不会阻止某人使用 a._np.sqrt(x)
,但至少可以清楚地表明他正在使用受保护的属性。
我在这里看到 2 种方法:
更人性化的解决方案:将别名更改为 "underscored"
import numpy as _np
...
这不会阻止导入它,但它会告诉用户这是实现细节,不应依赖于它们。
我首选的解决方案:什么也不做,保持原样,相应地使用 semver 和 bump 版本。
假设我在模块 a.py
import numpy as np
def sqrt(x):
return np.sqrt(x)
我有一个模块 b.py
是这样写的:
import a
print(a.sqrt(25))
print(a.np.sqrt(25))
我会看到代码运行良好,并且在大多数 IDE 中使用自动完成时,我发现 a.np
是可访问的。我想将 a.np
设为私有,这样只有 a
代码才能看到该变量。
我不希望 b
能够访问 a.np
.
实现这一目标的好方法是什么?
为什么我希望 a.np
无法访问?因为当我在 Jupyter Lab 中键入 a.
并按 Tab 时,我不希望它显示在自动完成中。它隐藏了模块可以做什么,因为我在我的模块中使用了太多导入。
解决方案与 class 中的 "protected" 属性/方法相同(模块中定义的名称实际上 - 在运行时 - 模块对象的属性):在这些名称前加上一个前导下划线,即
import numpy as _np
def sqrt(x):
return _np.sqrt(x)
请注意,这不会阻止某人使用 a._np.sqrt(x)
,但至少可以清楚地表明他正在使用受保护的属性。
我在这里看到 2 种方法:
更人性化的解决方案:将别名更改为 "underscored"
import numpy as _np ...
这不会阻止导入它,但它会告诉用户这是实现细节,不应依赖于它们。
我首选的解决方案:什么也不做,保持原样,相应地使用 semver 和 bump 版本。