Python: импортировать содержащий пакет

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

Импорт __init__ внутри модуля приведет к импорту не пакета, а модуля с именем __init__, что приведет к созданию двух копий вещей с разными именами ...

Есть ли питонический способ сделать это?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
60
0
33 945
5

Ответы 5

Это не совсем ответ на ваш вопрос, но я собираюсь предложить вам переместить функцию за пределы файла __init__.py в другой модуль внутри этого пакета. Затем вы можете легко импортировать эту функцию в другой модуль. Если вы хотите, вы можете иметь оператор импорта в файле __init__.py, который также будет импортировать эту функцию (при импорте пакета).

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

guy 12.01.2009 21:43

Не знаете, как это «непифоническое»? Разве альтернатива не была бы еще более запутанной, поскольку в этом.py на самом деле не является модулем?

Greg Case 12.01.2009 22:07

+1 - использование common.py в вашем пакете - обычная практика в Python.

cdleary 12.01.2009 22:28

Я бездельничал и не нашел лучшего способа

abyx 27.09.2009 11:51

Если пакет называется 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 загружается дважды.

dimo414 29.07.2012 22:03

Это неявный относительный импорт, и поэтому он не будет работать в python 3 и в любом случае является плохой практикой в ​​python 2.

habnabit 29.09.2014 21:34

Это все еще создает sys.modules['__init__']. По сути, модуль __init__.pyникогда не следует напрямую импортировать. Вместо этого импортируйте пакет (имя каталога).

Martijn Pieters 12.12.2014 17:44

Кроме того, начиная с 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 02.03.2014 01:24

@BrenBarn: но это способ импортировать его; когда вы импортируете упаковка, файл __init__.py служит эффективным пространством имен. Никогда не следует напрямую импортировать __init__.py.

Martijn Pieters 12.12.2014 17:43

В Django файл manage.py имеет from django.core.management import execute_manager, но execute_manager не является модулем. Это функция в модуле __init__.py каталога management.

Другие вопросы по теме