#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
был просто пример, если вы хотите использовать только один модуль.