你可以定义一个全局命名__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将其提供给自动完成,因为它仍然是全局命名空间的一部分。
既然您正在查看这些软件包的来源,或许您可以看到他们在做什么来阻止它们。 – martineau
是的,看着这个,但到目前为止还没有想法 – dreamwalker