У меня есть структура каталогов, которая выглядит следующим образом:Как сделать эти относительные операции импорта в 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)
ничего не показывает.
ли работа без импорта подстановочные? (I.e., вы можете импортировать WonderfulThing эксплицитно?) Относительный импорт может быть сложным сам по себе.Я предлагаю вам убедиться, что он работает, прежде чем перейти к __all__. –
'__all__' может содержать имена любых объектов. Им не обязательно быть (и, как правило, нет) только модули. –
«К сожалению, dir (foo) ничего не показывает». Ничего !? Для меня это показывает '['WonderfulThing', '__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 'first']' Вы должны что-то делать в корне неверно, или вы не показываете нам фактический код, потому что то, что вы описываете, отлично работает. –