Страницы

Поиск по вопросам

суббота, 29 декабря 2018 г.

Обращение к функции заданной в __init__.py

Здравствуйте. При инициализации пакета в Python 2.7, мне нужно определить функции, которые должны быть общими для всех модулей данного пакета. Я определил их в __init__.py. Как теперь к ней обратиться внутри пакета? Извне получается так:
import package.module package.foo() #обращение
Внутри пакета (например в модуле module), не определено foo, dir(__package__) - так же не выводит этой функции.
Структура проекта:
package\ # пакет __init__.py # здесь функция module.py # здесь мне функцию нужно вызвать
Названия, естественно, отличаются.


Ответ

Исправлено
На самом деле, файл __init__.py не предназначен для хранения реализации общих для пакета функций. Их предлагается выносить в другие файлы.
Вот что говорится в документации
<...> In the simplest case, __init__.py can just be an empty file, but it can also execute initialization code for the package or set the __all__ variable, described later.
Цитата с python-guide.org
<...> special behavior for the __init__.py file, which is used to gather all package-wide definitions. <...> Leaving an init.py file empty is considered normal and even a good practice, if the package’s modules and sub-packages do not need to share any code. Lastly, a convenient syntax is available for importing deeply nested packages: import very.deep.module as mod. This allows you to use mod in place of the verbose repetition of very.deep.module.

Таким образом, __init__.py нужен для того, чтобы настроить представление реализации пакета для использующих его скриптов. Например, с помощью переменной __all__ вы можете управлять видимыми подмодулями, или импортировать какой-то класс на уровень модуля.
Так что ответом на ваш вопрос будет то, что сейчас у вас неправильно распределена реализация функций по файлам, и стоит создать отдельный файл с реализацией нужных вам функций, а не хранить их в __init__.py

Например, если у вас сейчас есть функция boo в файле __init__.py, вы можете вынести её в файл module.py, при необходимости вынеся её на уровень пакета, добавив следующую строку в ваш файл __init__.py
# файл package/__init__.py from module import boo
и для внешнего кода, импортирующего ваш модуль, она станет доступна не только через прямой импорт
# файл my_script.py from package.module import boo
но и через импорт из пакета:
# файл my_script.py from package import boo # та же функция

Источники:
Документация Объяснение использования файла __init__.py python-guide.org

Комментариев нет:

Отправить комментарий