Могу ли я использовать псевдоним подпакета Python, чтобы он был доступен из пакета верхнего уровня с использованием точеPython

Программы на Python
Anonymous
Могу ли я использовать псевдоним подпакета Python, чтобы он был доступен из пакета верхнего уровня с использованием точе

Сообщение Anonymous »

Возможно, это действительно простой вопрос об упаковке, но я просто не смог найти на него ответа.
TLDR: Я хочу знать, можно получить доступ к вложенному подпакету (расположенному по адресу mypackage.subpackage.target_package), используя псевдоним с точечной записью mypackage.target_package. т. е. можете ли вы добавить mypackage.target_package в пространство имен верхнего уровня mypackage?
Полное объяснение:
Я разработка пакета Python, который изначально имел следующую структуру:

Код: Выделить всё

mypackage
├── __init__.py
├── subpackage
│   ├── __init__.py
│   └── module_b.py
└── target_package
├── __init__.py
└── module_c.py
Таким образом, target_package был доступен следующим образом: из mypackage.target_package import *. Однако я провожу некоторый рефакторинг и перемещаю target_package в подпакет.
Новая структура:

Код: Выделить всё

mypackage
├── __init__.py
└── subpackage
├── __init__.py
├── module_b.py
└── target_package
├── __init__.py
└── module_c.py
Проблема в том, что я не хочу нарушать обратную совместимость с прежним способом доступа к target_package, т. е. я хочу иметь доступ к mypackage.subpackage.target_package простым вызовом mypackage.target_package
Я пробовал много разных комбинаций импорта в трех файлах _init_.py и им удалось сделать модули внутри target_package (например, Module_c) доступными на этом уровне.
В настоящее время в самом внутреннем _init_.py, содержимое

Код: Выделить всё

# mypackage/subpackage/target_package/__init__.py
from . import
а внутри подпакета файл инициализации пустой

Код: Выделить всё

# mypackage/subpackage/__init__.py

и в инициализации верхнего уровня моего пакета:

Код: Выделить всё

# mypackage/__init__.py
from .subpackage import target_package
Имея их, я могу звонить

Код: Выделить всё

from mypackage import target_package
без проблем, но при попытке позвонить

Код: Выделить всё

import mypackage.target_package
выдает ошибку ModuleNotFound.
Какой совет? Есть ли способ сделать то, что я предлагаю? Противоречит ли это лучшим практикам? Стоит ли мне отказаться от обратной совместимости?

Подробнее здесь: https://stackoverflow.com/questions/783 ... ckage-usin

Вернуться в «Python»