模块公开导入的包

时间:2013-11-14 21:53:19

标签: python module

我有一个模块:

test
   __init__.py

__init__.py我有一行:

import numpy as np

我想在我想要创建的包(模块和子模块)中使用numpy。

问题是,不知何故,numpy正在暴露。如果我运行IPython并执行

import test

将有一个test.np可访问。

我查看了github上的许多软件包,它们经常在主__init__.py(sys,division等)中导入很多软件,然而当我在IPython中导入这些软件包时,没有任何外部模块被公开。

他们有什么不同的做法?

2 个答案:

答案 0 :(得分:3)

您可以定义全局名称__all__,设置为名称列表或元组,以限制导入的内容以及通常将列出的文档工具:

__all__ = ['function1', 'ClassName2']

__all__名称限制from test import *将导入的内容,文档工具也会使用它来限制列为给定模块的公共API的内容。

请参阅import statement文档:

  

模块定义的公共名称是通过检查模块命名空间中名为__all__的变量来确定的。如果已定义,则它必须是一个字符串序列,这些字符串是由该模块定义或导入的名称。 __all__中给出的名称都被视为公开名称,并且必须存在。如果未定义__all__,则公共名称集包括在模块命名空间中找到的所有名称,这些名称不以下划线字符('_')开头。 __all__应包含整个公共API。它旨在避免意外导出不属于API的项目(例如在模块中导入和使用的库模块)。

您检查的__init__模块几乎肯定会定义__all__个序列。

如果您的功能稍后不需要访问全局名称,您也可以从模块中再次删除名称:

del sys

否则,IPython自动完成将使用不以下划线开头的所有名称;自动完成会忽略__all__列表,但会忽略_sys之类的名称。

numpy.__init__ module(版本1.8.0之前)本身会再次从全局命名空间中删除名称:

if __NUMPY_SETUP__:
    import sys as _sys
    _sys.stderr.write('Running from numpy source directory.\n')
    del _sys

但是sys绑定为_sys,即使没有删除,IPython也会忽略该名称。 numpy还会在该模块中构建__all__列表。

numpy 1.8.0及更高版本中,import sys语句被添加到该文件中,IPython为自动完成提供了它,因为它仍然是全局命名空间的一部分。

答案 1 :(得分:-1)

您必须确保仅以某种方式将其导入本地命名空间。