аватар question@mail.ru · 01.01.1970 03:00

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

При инициализации пакета в Python 2.7, мне нужно определить функции, которые должны быть общими для всех модулей данного пакета. Я определил их в __init__.py. Как теперь к ней обратиться внутри пакета? Извне получается так:

import package.modulepackage.foo() #обращение

Внутри пакета (например в модуле module), не определено foo, dir(__package__) - так же не выводит этой функции.

Структура проекта:

package\         # пакет    __init__.py  # здесь функция    module.py    # здесь мне функцию нужно вызвать

Названия, естественно, отличаются.

аватар answer@mail.ru · 01.01.1970 03:00

Исправлено

На самом деле, файл __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.

Цитата с :

<...> 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__.pyfrom module import boo

и для внешнего кода, импортирующего ваш модуль, она станет доступна не только через прямой импорт

# файл my_script.pyfrom package.module import boo

но и через импорт из пакета:

# файл my_script.pyfrom package import boo          # та же функция

Источники:

Последние

Похожие