我正在编写一个模块来加载数据集。我希望尽可能保持接口/ API的清洁 - 因此我通过在__
前面添加名称来隐藏内部函数和变量。真棒。但是,我的模块会导入仍出现在我的模块命名空间中的其他包(例如numpy
),我该如何避免这种情况?
即。我的文件看起来像:
Loader.py:
import numpy as np
__INTERNAL_VAR1 = True
EXTERNAL_VAR = True
def loadData():
data = __INTERNAL_FUNC1()
...
return data
def __INTERNAL_FUNC1():
...
return data
当我导入我的模块np
时暴露:
> import Loader
> Loader.[TAB]
Loader.EXTERNAL_VAR Loader.loadData Loader.np
答案 0 :(得分:2)
如果您正在使用的自动完成功能已正确实现,则应该遵循模块的__all__
属性(如果已设置)。
添加模块以该名称导出的所有名称的列表:
__all__ = ['loadData', 'EXTERNAL_VAR']
__all__
变量用于确定在使用from modulename import *
通配符导入时导入的名称,以及在记录模块时使用help()
函数。
使用双下划线名称作为全局变量是没有意义的;它在开始时是一个单下划线,标记为“内部”(按惯例)。
答案 1 :(得分:0)
另一种解决方案是创建一个__init__.py
,其中包含一行导入所需的函数和变量的行:
from Loader import EXTERNAL_VAR,loadData
此文件应放在包含您的模块的文件夹内
└── Loader
├── __init__.py
└── Loader.py
现在,当您导入Loader
时,您只能直接访问EXTERNAL_VAR
和loadData
,而所有其他类和模块都位于Loader.Loader.
中
此解决方案应独立于自动完成系统。