Python: доступ к функции __init__.py из пакета - PullRequest
0 голосов
/ 01 мая 2020

Я пытаюсь найти способ определить функцию журнала в файле widgets/__init__.py, который затем можно использовать в подпакетах.

В настоящее время у меня есть такая файловая структура:

app.py
widgets/__init__.py
widgets/input/__init__.py
widgets/input/input.py

Содержимое app.py:

import widgets

widgets.input.create_foo()

Содержимое widgets/__init__.py:

from .input import input

def foo():
    print('foo')

Содержимое widgets/input/input.py:

from .. import foo

def create_foo():
    foo()

If Я запускаю его так, я получаю сообщение об ошибке «ImportError: невозможно импортировать имя« foo »из« widgets »из widgets/__init__.py. Это имеет смысл, потому что я пытаюсь импортировать функцию, которая еще не создана.

Я бы хотел избежать создания отдельного модуля или подпакета только для этой 1 функции. Есть ли простой способ определить функцию 'foo ()' внутри widgets/__init__.py, которую можно использовать в подпакетах? Что я здесь не так делаю?

Причина, по которой я хочу сделать это так, заключается в том, что я хочу иметь функцию журнала, которую я могу использовать повсюду в подпакетах, без необходимости воссоздавать ее в каждой подпапке. -package.

Я все еще новичок во всем этом пакете, поэтому, пожалуйста, не жарьте меня до упора :))

1 Ответ

1 голос
/ 01 мая 2020

__init__.py не обязательно. Начиная с python 3.3 каждый python файл является пакетом пространства имен . Кроме того, относительный импорт может быть сложным. Я предлагаю подход абсолютного импорта:

.
├── app.py
└── widgets
    ├── input
    │   ├── input.py
    │   └── __pycache__
    ├── __pycache__
    └── utils.py

app.py:

from widgets.input.input import create_foo

create_foo()

input.py:

from widgets.utils import foo

def create_foo():
    foo()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...