3

我有一个模块:

test
   __init__.py

__init__.py我有单行:

import numpy as np

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

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

import test

将有一个可访问的 test.np。

我查看了 github 上的许多包,它们经常在主__init__.py目录(sys、division 等)中导入很多包,但是当我在 IPython 中导入这些包时,并没有暴露任何外部模块。

他们在做什么不同?

4

2 回答 2

3

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

__all__ = ['function1', 'ClassName2']

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

请参阅import声明文档:

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

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

您还可以从模块中再次删除名称,前提是您的函数以后不需要访问全局名称:

del sys

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

numpy.__init__模块(版本 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 提供它用于自动完成,因为它仍然是全局命名空间的一部分。

于 2013-11-14T21:57:45.657 回答
-1

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

于 2013-11-14T21:57:38.280 回答