Python 使导入的模块对其他模块专用

Python 使导入的模块对其他模块专用,python,import,python-import,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中使用autocomplete时,我发现a.np是可访问的。我想将a.np设为私有,这样只有acode才能看到该变量。 我不希望b能够访问a.np 什么是使这成为可能的好方法 为什么

假设我在模块
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中使用autocomplete时,我发现
a.np
是可访问的。我想将
a.np
设为私有,这样只有
a
code才能看到该变量。 我不希望
b
能够访问
a.np

什么是使这成为可能的好方法


为什么我希望
a.np
不可访问?因为当我在Jupyter Lab中键入
a.
并按Tab键时,我希望它不会显示在自动完成中。它隐藏了模块可以做什么,因为我在模块中使用了太多导入。

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

import numpy as _np

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

请注意,这不会阻止某人使用
a.\u np.sqrt(x)
,但至少它清楚地表明他使用的是受保护的属性。

我在这里看到了两种方法:

  • 更方便用户的解决方案:将别名更改为“下划线”别名

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

  • 我首选的解决方案:不做任何事情,保持原样,相应地使用semver和bump版本


  • 有没有一种方法我不必重命名我所有的变量,或者有一种更聪明的方法来完全构造代码?因为我认为没有人希望在他们的代码中使用
    \u np
    。我不知道Jupyter如何处理自动完成(我不打算安装它来试用),但您可以始终尝试在您的模块中定义
    \u all\u
    (cf)-如果Jupyter使用此属性,它可能会解决问题,否则,您将不得不执行搜索/替换或使用它。提示:在
    sqrt
    函数中,名称
    np
    的解析在运行时发生……当
    a.sqrt
    不再定义时,调用
    a.sqrt
    会发生什么?
    import numpy as _np
    ...