我有一个模块:
test
__init__.py
在__init__.py
我有一行:
import numpy as np
我想在我想要创建的包(模块和子模块)中使用numpy。
问题是,不知何故,numpy正在暴露。如果我运行IPython并执行
import test
将有一个test.np可访问。
我查看了github上的许多软件包,它们经常在主__init__.py
(sys,division等)中导入很多软件,然而当我在IPython中导入这些软件包时,没有任何外部模块被公开。
他们有什么不同的做法?
答案 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)
您必须确保仅以某种方式将其导入本地命名空间。