Кругові залежності завдяки підказкам типу
З натяками на тип є більше можливостей для створення кругового імпорту. До щастя, є рішення , використовуючи спеціальну константу: typing.TYPE_CHECKING
.
Наступний приклад визначає Vertex
клас і Edge
клас. Ребро визначається двома вершинами, а вершина підтримує список сусідніх ребер, до яких воно належить.
Без підказок типу, помилок немає
Файл: vertex.py
class Vertex:
def __init__(self, label):
self.label = label
self.adjacency_list = []
Файл: edge.py
class Edge:
def __init__(self, v1, v2):
self.v1 = v1
self.v2 = v2
Тип Підказки Причина ImportError
ImportError: неможливо імпортувати ім'я 'Edge' з частково ініціалізованого модуля 'edge' (швидше за все, через круговий імпорт)
Файл: vertex.py
from typing import List
from edge import Edge
class Vertex:
def __init__(self, label: str):
self.label = label
self.adjacency_list: List[Edge] = []
Файл: edge.py
from vertex import Vertex
class Edge:
def __init__(self, v1: Vertex, v2: Vertex):
self.v1 = v1
self.v2 = v2
Рішення за допомогою TYPE_CHECKING
Файл: vertex.py
from typing import List, TYPE_CHECKING
if TYPE_CHECKING:
from edge import Edge
class Vertex:
def __init__(self, label: str):
self.label = label
self.adjacency_list: List['Edge'] = []
Файл: edge.py
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from vertex import Vertex
class Edge:
def __init__(self, v1: 'Vertex', v2: 'Vertex'):
self.v1 = v1
self.v2 = v2
Процитовані проти підказок типу без котирувань
У версіях Python до 3.10 умовно імпортовані типи повинні міститися в лапках, роблячи їх "прямими посиланнями", що приховує їх від середовища виконання інтерпретатора.
У Python 3.7, 3.8 та 3.9 обхідним шляхом є використання такого спеціального імпорту.
from __future__ import annotations
Це дозволяє використовувати підказки типу без котирувань у поєднанні з умовним імпортом.
У Python 3.10 анотації функцій та змінних більше не оцінюватимуться під час визначення. Натомість форма рядка буде збережена у відповідному словнику анотацій . Статичні перевірки типу не бачать різниці в поведінці, тоді як інструменти, що використовують анотації під час виконання, повинні виконувати відкладене оцінювання.
Форма рядка отримується з AST на етапі компіляції, що означає, що форма рядка може не зберегти точне форматування джерела. Примітка: якщо анотація вже була рядковим літералом, вона все одно буде загорнута в рядок.