Подсказка типов в Python без циклического импорта
При попытке разделить большой класс на два меньших возникает проблема циклического импорта. импорт. Класс «main» импортирует класс примеси, а класс примеси ссылается на «основной» класс в подсказке типа. Это приводит к циклу импорта, препятствующему правильной работе подсказки типа.
Чтобы решить эту проблему, вы можете рассмотреть следующий подход:
# main.py
from __future__ import annotations
from typing import TYPE_CHECKING, Any
if TYPE_CHECKING:
from mixin import MyMixin
class Main(object):
def func1(self, xxx: Any):
...
# mixin.py
from __future__ import annotations
from typing import TYPE_CHECKING, Any
if TYPE_CHECKING:
from main import Main
class MyMixin(object):
def func2(self: Main, xxx: Any):
...
В этом примере константа TYPE_CHECKING Python используется для условного импорта «основного» класса. При запуске кода оператор импорта пропускается, поскольку константа имеет значение False. Однако инструменты проверки типов, такие как mypy, интерпретируют код внутри блока if TYPE_CHECKING и распознают аннотацию типа для func2.
Другой подход предполагает использование прямой ссылки:
# mixin.py
from __future__ import annotations
from typing import TYPE_CHECKING, Any
if TYPE_CHECKING:
from main import Main
class MyMixin(object):
def func2(self, xxx: 'Main'):
...
Здесь аннотация типа для func2 представляет собой строку, представляющую имя класса, который будет импортирован позже. Оба подхода требуют использования Python 3.7 или выше для эффективной работы с подсказками типов.
Помните, что использование примесей и подсказок типов может потребовать дополнительного структурирования вашего кода. Например, mypy рекомендует создать абстрактный базовый класс (ABC), от которого наследуются ваши «основной» и миксин-классы. Это может повысить точность проверки типов.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3