Страницы

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

пятница, 13 декабря 2019 г.

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

#python


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

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


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

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

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


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


Ответы

Ответ 1



Исправлено На самом деле, файл __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

Ответ 2



Внутри пакета к модулям при импортировании из других модулей обращаются через точку. Если к примеру в __init__.py имеется функция create_app, то в другом модуле лежащим в этой этой же папке импортирование этой функции будет таким: from . import create_app А если модуль в под-папке, то через две точки: from .. import create_app Подроблнее можно почитать либо в официальной документации на docs.python.org, либо в книге "Python. Подробный справочник. 4 издание" Девида Бизли с ISBN 978-5-93286-157-8, начиная со стр. 189

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

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