Есть ли способ решить проблемы с импортом с помощью __init__.py?

#python #python-3.x #autocomplete #python-import

Вопрос:

У меня есть пакет с такой структурой

 framework/
    __init__.py
    file0.py
    file1.py
    file2.py
    file3.py
 

Я хочу иметь возможность импортировать его как import framework , но я не могу сделать это таким образом, from framework import * работает только, и это тоже без автозаполнения. file0.py и file1.py являются классами, а остальные имеют только функции.
Однако автозаполнение работает, когда я делаю это вручную для файла, над которым работаю, во внешнем каталоге

 from framework import file0
from file0 import *
# and so on for the others
 

Это мой __init.py__

 from framework.file0 import file0
from framework.file1 import file1
from framework.file2 import *
from framework.file3 import *
 

Я пытался положить

 from framework import file0
from file0 import *
# and so on for the others
 

включено __init.py__ , но это не решает проблему, автозаполнение по-прежнему не работает, если я не помещу их в фактический файл, над которым я работаю, в другой каталог. Я хочу, чтобы он мог работать над import framework
Есть ли способ?
Заранее спасибо. Я новичок в этом деле, поэтому буду признателен за любой совет.

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

1. Можете ли вы изменить отступ в структуре, чтобы сделать ее более четкой

2. @mkrieger1 моя ошибка, я ее отредактировал

3. @CyDevos изменил отступ

4. Нет, file0.py и file1.py это не занятия. Это файлы , определяющие модули, которые могут содержать классы.

Ответ №1:

То , что вы хотите для своего __init__.py from .file0 import file0 сайта, или любой контент file0.py , который вы хотите импортировать.

См.раздел Относительный импорт пакетов в документах Python.

Тем не менее, я думаю, что не рекомендуется импортировать все в пакете в __init__.py . Если вы это сделаете, он будет загружаться в python каждый раз, когда вы пытаетесь импортировать что-либо из этого пакета. Допустим, вы хотите сделать from framework.file0 import SomeClass что-то в каком-то другом пакете, и этот класс-все, что вам нужно framework . Если вы импортируете все __init__py , вы будете загружать все это каждый раз, когда прикасаетесь к этому пакету, так __init__.py как он всегда загружается при доступе к пакету.

Если вам нужен способ импортировать все из пакета, может быть, вам следует поместить это в другой файл , скажем all.py , а затем сделать from framework import all as framework ?

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

1. from .file0 import file0 дает ImportError: attempted relative import with no known parent package . Я не уверен, в чем причина проблемы

2. Я думаю, что это происходит, если вы находитесь в корневом каталоге проекта, который сам по себе не является пакетом. Это модуль. Подкаталоги с __init__.py пакетом-это пакет. Вы можете использовать только относительный импорт в пакетах. Попробуйте обойтись без точки, from file0 import * т. е.

Ответ №2:

Условно, __init__.py это должно быть оставлено пустым.

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

 import framework
 

И если вы по какой-то причине хотите импортировать только один модуль, скажем framework.file0 , вы можете использовать

 import framework.file0
 

Что касается автозаполнения, то этот подход сработал для меня как в ноутбуке JupyterLab, так и на консоли.

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

1. Я хочу иметь возможность импортировать все эти файлы, все они будут использоваться

2. Дело в том, что это работает, но импорт всех этих файлов может быть обременительным каждый раз

3. Использование import framework импортирует все, что находится в каталоге фреймворка. Для доступа к отдельным модулям вы будете использовать framework.file0 экземпляр в своем коде, как и любой другой стандартный пакет.

4. Это import framework.file0 был просто пример, если вы хотите использовать только один модуль.