避免模​​块命名空间中的子模块和外部包

时间:2014-12-21 02:28:16

标签: python module namespaces package

我正在编写一个模块来加载数据集。我希望尽可能保持接口/ 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

2 个答案:

答案 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_VARloadData,而所有其他类和模块都位于Loader.Loader.中 此解决方案应独立于自动完成系统。