2013-05-28 2 views
1

Вот простой случай: я хочу определить модуль в роботе имени python. Итак, у меня есть папка с именем робот с этими двумя файлами:Python: from module import * in __init__

__init__.py:

from test import a 

test.py:

a = "hello world" 

Теперь, когда я import robot в интерпретатор, пространство имен robot включает в себя test и a. Тем не менее, я хочу, чтобы он включал a. Почему это странное поведение?


EDIT:

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

Учитывая следующие файлы:

__init__.py:

from spam import a 
import ham 

spam.py:

a = "hello world" 

ham.py:

b = "foo" 

Могу ли я иметь robot пространство имен, содержащее a и ham на ее верхнем уровне, но не spam?

+0

'import robot' импортирует пакет робота (каталог). Поскольку вы не указываете, что импортировать, весь пакет импортируется. – Andenthal

ответ

0

Вы создали не только модуль, но и пакет. Пакет содержит свои подмодули в своем пространстве имен (после их импорта, поскольку вы импортировали test здесь). Это так, как должно быть, поскольку обычный способ использования пакетов - обеспечить группировку нескольких модулей. Нельзя использовать пакет, содержащий только один модуль (т. Е. Один контент .py) внутри него.

Если вам нужен только однофайловый модуль, просто создайте файл с именем robots.py и разместите там свой код.

Редактировать: См. this previous question. Ответ заключается в том, что вы вообще не должны беспокоиться об исключении имен модулей из пространства имен пакетов. Модули предположили, что должны быть в пространстве имен пакетов. Если вы хотите добавить функции и прочее из подмодулей, для удобства это прекрасно, но на самом деле ничего не получится, «покрывая ваши дорожки» и скрывая модули, которые вы импортировали. Однако, как описано в ответах на этот вопрос, есть некоторые хакерские способы приблизиться к тому, что вы хотите.

+0

Вижу, спасибо. Я отредактировал свое оригинальное сообщение, чтобы быть более представительным, чего я действительно хочу достичь. У меня есть некоторые подмодули, но я также хочу, чтобы некоторые функции отображались на верхнем уровне. Есть ли способ сделать это? – user2364719

+0

@ user2364719: Я отредактировал свой ответ. Основной ответ заключается в том, что, хотя вы можете взломать его, вы не должны беспокоиться об удалении модулей из пространства имен пакетов, поскольку модули * предполагается * находиться в пространстве имен пакетов. Вы можете добавить другие вещи в пространство имен пакетов, но основная цель пространства имен пакетов состоит в том, чтобы удерживать модули, а Python не обеспечивает простой способ избежать этого. – BrenBarn

+0

Хорошо, тогда я буду импортировать функциональность «core» из _core.py, поэтому она скрыта. Благодаря! – user2364719

0

Вы спрашиваете, как импортировать определенные модули или функции?

тест.py:

import robot.spam.a 
import robot.ham 

Не импортируйте весь пакет.

+0

Тогда у меня были бы robot.spam.a и robot.ham. Извините за неясность, но я хотел бы иметь своего рода «основной» файл, который включает в себя все функции и классы, которые я хочу получить на верхнем уровне пакета/модуля робота. – user2364719

+0

Создайте 'robot' модуль (файл .py). Определите 'a',' test', 'ham' и' spam' внутри робота. Тогда у вас будут 'robot.a',' robot.spam', 'robot.ham' и т. Д. Что вы хотите сделать, сохраните все в одном каталоге. – Andenthal

+0

Имеет смысл, но на самом деле все это ~ 10k loc. Разделение его в подмодулях удобно для организации, и мне не всегда нужно импортировать все (иногда мне нужна только ветчина). – user2364719