2009-10-17 3 views
2

У меня есть структура каталогов, которая выглядит следующим образом:Как сделать эти относительные операции импорта в Python 3?

project/ 
     __init__.py 
     foo/ 
      __init.py__ 
      first.py 
      second.py 
      third.py 
     plum.py 

В project/foo/__init__.py я импортировать классы из first.py, second.py и third.py и поместить их в __all__.

Там есть класс first.py имени WonderfulThing, который я хотел бы использовать в second.py и хотите импортировать путем импорта * из foo. (Это выходит за рамки этого вопроса, почему я хотел бы сделать это, предположим, что у меня есть уважительная причина.)

В second.py я попытался from .foo import *, from foo import * и from . import * и ни в одном из этих случаев WonderfulThing импортирован , Я также попробовал from ..foo import *, что приводит к ошибке «Попытка относительного импорта за пределы пакета верхнего уровня».

Я читал документы и PEP, и я не могу понять, как это сделать. Любая помощь будет оценена.

Уточнение/Редактирование: Похоже, что я, возможно, неправильно понимал, как __all__ работает в пакетах. Я использую его так же, как и в модулях,

from .first import WonderfulThing 
__all__ = [ "WonderfulThing" ] 

но глядя снова на документы, что позволяет предположить, что __all__ может использоваться только в пакетах, чтобы указать имена модулей, которые будут импортированы по умолчанию; похоже, нет никакого способа включить что-либо, что не является модулем.

Это правильно?

Редактировать: Импорт несимметричных символов невозможен (cannot import name WonderfulThing). Попытка from . import foo не удалась, но import foo работает. К сожалению, dir(foo) ничего не показывает.

+0

ли работа без импорта подстановочные? (I.e., вы можете импортировать WonderfulThing эксплицитно?) Относительный импорт может быть сложным сам по себе.Я предлагаю вам убедиться, что он работает, прежде чем перейти к __all__. –

+2

'__all__' может содержать имена любых объектов. Им не обязательно быть (и, как правило, нет) только модули. –

+0

«К сожалению, dir (foo) ничего не показывает». Ничего !? Для меня это показывает '['WonderfulThing', '__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 'first']' Вы должны что-то делать в корне неверно, или вы не показываете нам фактический код, потому что то, что вы описываете, отлично работает. –

ответ

3

Редактировать: Я неправильно понял вопрос: Нет __all__ не ограничивается только модулями.

Вопрос в том, почему вы хотите сделать относительный импорт. Нет ничего плохого в том, чтобы делать from project.foo import *, здесь. Во-вторых, ограничение __all__ на foo не помешает вам делать from project.foo.first import WonderfulThing или просто from .first import WonderfulThing, что все равно будет лучшим способом.

И если вы действительно хотите импортировать много вещей, это, вероятно, лучше всего сделать from project import foo, а затем использовать вещи с foo.WonderfulThing вместо этого делать в import *, а затем с помощью WonderfulThing непосредственно.

Однако, чтобы ответить на ваш прямой вопрос, чтобы импортировать из файла __init__ в second.py вы это делаете:

from . import WonderfulThing 

или

from . import *