2013-11-14 4 views
2

У меня есть модуль:модулей разоблачения импортированы пакеты

test 
    __init__.py 

В __init__.py У меня есть одну строки:

import numpy as np 

Я хочу использовать NumPy через пакет (модули и подмодули) Я хочу, чтобы создать ,

Проблема в том, что какой-то бесчисленное количество подвергается воздействию. Если я запускаю IPython и делаю

import test 

Доступен test.np.

Я посмотрел на множество пакетов на github, и они часто импортируют много в основном __init__.py (sys, division и т. Д.), И все же, когда я импортирую эти пакеты в IPython, ни один из внешних модулей не отображается.

Что они делают по-другому?

+0

Поскольку вы смотрите на источники этих пакетов, возможно, вы можете видеть, что они делают, что мешает. – martineau

+0

Да, изучая это, но пока не знаю – dreamwalker

ответ

2

Вы можете определить глобальное имя __all__, установленного в список или кортеж имен, чтобы ограничить то, что ввозится и какими документы инструментов обычно перечислят:

__all__ = ['function1', 'ClassName2'] 

Пределы __all__ имени, что from test import * будет импорт, а также используется инструментами документации для ограничения того, что указано в качестве открытого API для данного модуля.

См import statement документацию:

The публичные имена, определенные в модуле определяются проверки имен модуля для переменной с именем __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 предлагает его для автозаполнения, поскольку он по-прежнему является частью глобального пространства имен.

+0

Использование '__all__' и отказ от' np' не сделает 'test.np' недоступным. – martineau

+0

@martineau: Нет, но * это не вопрос *. IPython показывает цели автозавершения, и ОП задается вопросом, почему некоторые проекты, похоже, импортируют всевозможные библиотеки, но IPython не перечисляет их. –

+0

Я тестировал это, и даже если у меня есть '__all__' = [], я все еще вижу в IPython все, что я импортирую в' __init __. Py'. Независимо от того, является ли оператор импорта импортным numpy или import numpy как np, import sys и т. Д. – dreamwalker

-1

Вы должны убедиться, что вы как-то импортируете его в локальное пространство имен.

+0

Хотя это можно сделать, импортировав его в каждую функцию модуля, которая его использует, помимо того, что она утомительна, она также будет неэффективной. – martineau

Смежные вопросы