将导入的模块设为其他模块专用

时间:2019-01-30 11:14:36

标签: python import python-import

假设我在模块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 时,它不会显示在自动完成中。它隐藏了模块可以做什么,因为我在模块中使用了很多导入。

2 个答案:

答案 0 :(得分:2)

解决方案与类中“受保护”属性/方法的解决方案相同(模块中定义的名称实际上是-在运行时-模块对象的属性):在这些名称前加一个下划线,即

import numpy as _np

def sqrt(x):
  return _np.sqrt(x)

请注意,这不会阻止某人使用a._np.sqrt(x),但至少可以很清楚地表明他正在使用受保护的属性。

答案 1 :(得分:0)

我在这里看到2种方法:

  1. 更人性化的解决方案:将别名更改为“带下划线”

    import numpy as _np
    ...
    

    这不会阻止导入它,但会告诉用户这是实现细节,不应依赖它们。

  2. 我最喜欢的解决方案:什么也不做,保持原样,相应地使用semver和凹凸版本。