В модуле, находящемся внутри пакета, мне необходимо использовать функцию, определенную в __init__.py этого пакета. как я могу импортировать пакет в модуль, который находится внутри пакета, чтобы я мог использовать эту функцию?
Импорт __init__ внутри модуля приведет к импорту не пакета, а модуля с именем __init__, что приведет к созданию двух копий вещей с разными именами ...
Есть ли питонический способ сделать это?






Это не совсем ответ на ваш вопрос, но я собираюсь предложить вам переместить функцию за пределы файла __init__.py в другой модуль внутри этого пакета. Затем вы можете легко импортировать эту функцию в другой модуль. Если вы хотите, вы можете иметь оператор импорта в файле __init__.py, который также будет импортировать эту функцию (при импорте пакета).
Не знаете, как это «непифоническое»? Разве альтернатива не была бы еще более запутанной, поскольку в этом.py на самом деле не является модулем?
+1 - использование common.py в вашем пакете - обычная практика в Python.
Я бездельничал и не нашел лучшего способа
Если пакет называется testmod, и ваш файл инициализации, следовательно, testmod/__init__.py, а ваш модуль в пакете - submod.py, то из файла submod.py вы должны просто сказать import testmod и использовать все, что вы хотите, что определено в testmod.
Я не совсем уверен, в какой ситуации, но это может решить вашу проблему "другого имени":
import __init__ as top
top.some_function()
Или, может быть?:
from __init__ import some_function
some_function()
Это работает, но, по крайней мере, в cPython 2.7 интерпретатор считает, что __init__ отличается от модуля top, и поэтому файл __init__.py загружается дважды.
Это неявный относительный импорт, и поэтому он не будет работать в python 3 и в любом случае является плохой практикой в python 2.
Это все еще создает sys.modules['__init__']. По сути, модуль __init__.pyникогда не следует напрямую импортировать. Вместо этого импортируйте пакет (имя каталога).
Кроме того, начиная с Python 2.5 возможен относительный импорт. например.:
from . import foo
Цитата из http://docs.python.org/tutorial/modules.html#intra-package-references:
Начиная с Python 2.5, в дополнение к неявному относительному импорту, описанному выше, вы можете написать явный относительный импорт с помощью формы имени импорта из модуля оператора импорта. Этот явный относительный импорт использует начальные точки для обозначения текущего и родительского пакетов, участвующих в относительном импорте. Например, из окружающего модуля вы можете использовать:
from . import echo
from .. import formats
from ..filters import equalizer
Это не отвечает на вопрос, как импортировать из __init__.py.
@BrenBarn: но это способ импортировать его; когда вы импортируете упаковка, файл __init__.py служит эффективным пространством имен. Никогда не следует напрямую импортировать __init__.py.
В Django файл manage.py имеет from django.core.management import execute_manager, но execute_manager не является модулем. Это функция в модуле __init__.py каталога management.
Я понимаю, что могу это сделать, это кажется довольно беспорядочным и непифоничным.