Как избежать циклического импорта в системе управления магазинами PythonPython

Программы на Python
Ответить
Anonymous
 Как избежать циклического импорта в системе управления магазинами Python

Сообщение Anonymous »

Я создаю систему управления магазином, в которой различные компоненты магазина должны перемещаться между собой. Я сталкиваюсь с проблемами циклического импорта и в настоящее время решаю их путем импорта внутренних методов, но считаю, что это не лучший подход.
Вот упрощенная версия моего кода:

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

from typing import TYPE_CHECKING

if TYPE_CHECKING:
from .department_store import DepartmentStore

class BaseStore:
def navigate_to_department(self, dept_id: str) -> "DepartmentStore":
# Import inside method to avoid circular import
from .department_store import DepartmentStore
return DepartmentStore(dept_id, self.inventory_system)
department_store.py

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

from typing import TYPE_CHECKING

if TYPE_CHECKING:
from .section_store import SectionStore

class DepartmentStore:
def __init__(self, dept_id: str, inventory_system):
self.dept_id = dept_id
self.inventory_system = inventory_system

def navigate_to_section(self, section_id: str) -> "SectionStore":
# Import inside method to avoid circular import
from .section_store import SectionStore
return SectionStore(self.dept_id, section_id, self.inventory_system)
section_store.py

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

from typing import TYPE_CHECKING

if TYPE_CHECKING:
from .department_store import DepartmentStore

class SectionStore:
def __init__(self, dept_id: str, section_id: str, inventory_system):
self.dept_id = dept_id
self.section_id = section_id
self.inventory_system = inventory_system

def navigate_to_parent_department(self) -> "DepartmentStore":
# Import inside method to avoid circular import
from .department_store import DepartmentStore
return DepartmentStore(self.dept_id, self.inventory_system)
Магазины образуют иерархию, в которой:
  • Код: Выделить всё

    BaseStore
    может перейти в универмаг (например, электроника, одежда)
  • Код: Выделить всё

    DepartmentStore
    может перейти в магазин разделов (например, телевизоры в разделе «Электроника»)
  • Код: Выделить всё

    SectionStore
    может вернуться в родительский магазин DepartmentStore
В настоящее время я обрабатываю циклический импорт следующим образом:
  • Использование TYPE_CHECKING для подсказок типов
  • Импорт необходимых классов внутри методов
Хотя это работает, я чувствую, что может быть лучший шаблон или архитектура, которая могла бы вообще избежать этого циклического импорта. Есть ли более элегантный способ структурировать этот код?
Некоторые идеи, которые я рассмотрел:
  • Перемещение всего хранилища классы в один файл (неудобно с точки зрения удобства обслуживания)
  • Создание отдельного класса фабрики хранилища (кажется, перепроектирование)
  • Какое-то использование внедрения зависимостей
  • Какое-то использование внедрения зависимостей
  • li>
    Создание абстрактного интерфейса навигации
Какой питонический способ обработки такого шаблона навигации по магазину?

Подробнее здесь: https://stackoverflow.com/questions/792 ... ent-system
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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