Обработка циклического импорта типов подклассов в абстрактном классе.

Я сталкиваюсь с циклической ошибкой импорта, когда определяю псевдонимы типов для подклассов абстрактного класса.

Это пример того, чего я пытаюсь достичь:

      #abstract_file_builder.py

from abc import ABC, abstractmethod
from typing import Generic, MutableSequence, TypeVar

from mymodule.type_a_file_builder import TypeARow
from mymodule.type_b_file_builder import TypeBRow

GenericRow = TypeVar("GenericRow", TypeARow, TypeBRow)

class AbstractFileBuilder(ABC, Generic[GenericRow]):
    ...
    
    @abstractmethod
    def generate_rows(
        self,
    ) -> MutableSequence[GenericRow]:
        pass

      #type_a_file_builder.py

from typing import Any, MutableSequence

from mymodule.abstract_file_builder import AbstractFileBuilder

TypeARow = MutableSequence[Any]

class TypeAFileBuilder(AbstractFileBuilder[TypeARow]):
    ...

    def generate_rows(
        self,
    ) -> MutableSequence[TypeARow]:
        ... # Code logic for TypeA
        return rows

      #type_b_file_builder.py

from typing import MutableSequence, Union

from mymodule.abstract_file_builder import AbstractFileBuilder

TypeBRow = MutableSequence[Union[int, float]]

class TypeBFileBuilder(AbstractFileBuilder[TypeBRow]):
    ...

    def generate_rows(
        self,
    ) -> MutableSequence[TypeBRow]:
        ... # Code logic for TypeB
        return rows

Какой самый питонический способ решить эту проблему?

Я знаю, что могу использоватьTYPE_CHECKINGпеременная, чтобы избежать импорта во время выполнения, но это похоже на патч, а не на хорошее решение.

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

Однако я не уверен, смогу ли я создать некоторую форму псевдонима «абстрактного» типа внутриabstract_file_builder.pyфайл, а затем объявите типы TypeARow и TypeBRow как дочерние элементы этого абстрактного типа.

Должен отметить, что решение должно работать, как минимум, сPython 3.9. Если он поддерживает версии до3.7будет лучше, но не супер необходимо.

0 ответов

Другие вопросы по тегам