Обработка циклического импорта типов подклассов в абстрактном классе.
Я сталкиваюсь с циклической ошибкой импорта, когда определяю псевдонимы типов для подклассов абстрактного класса.
Это пример того, чего я пытаюсь достичь:
#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
будет лучше, но не супер необходимо.