Zirkuläre Abhängigkeiten aufgrund von Typhinweisen
Mit Typhinweisen gibt es mehr Möglichkeiten, zirkuläre Importe zu erstellen. Glücklicherweise gibt es eine Lösung mit der speziellen Konstante : typing.TYPE_CHECKING
.
Das folgende Beispiel definiert eine Vertex
Klasse und eine Edge
Klasse. Eine Kante wird durch zwei Scheitelpunkte definiert, und ein Scheitelpunkt verwaltet eine Liste der benachbarten Kanten, zu denen er gehört.
Ohne Typhinweise kein Fehler
Datei: vertex.py
class Vertex:
def __init__(self, label):
self.label = label
self.adjacency_list = []
Datei: edge.py
class Edge:
def __init__(self, v1, v2):
self.v1 = v1
self.v2 = v2
Typ Hinweise Ursache ImportError
ImportError: Der Name 'Edge' kann nicht aus dem teilweise initialisierten Modul 'edge' importiert werden (höchstwahrscheinlich aufgrund eines zirkulären Imports).
Datei: 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] = []
Datei: edge.py
from vertex import Vertex
class Edge:
def __init__(self, v1: Vertex, v2: Vertex):
self.v1 = v1
self.v2 = v2
Lösung mit TYPE_CHECKING
Datei: 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'] = []
Datei: 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
Zitierte oder nicht zitierte Typhinweise
In Versionen von Python vor 3.10 müssen bedingt importierte Typen in Anführungszeichen gesetzt werden, sodass sie "Weiterleitungsreferenzen" sind, wodurch sie vor der Interpreter-Laufzeit verborgen werden.
In Python 3.7, 3.8 und 3.9 besteht eine Problemumgehung darin, den folgenden speziellen Import zu verwenden.
from __future__ import annotations
Dies ermöglicht die Verwendung von nicht zitierten Typhinweisen in Kombination mit bedingten Importen.
In Python 3.10 werden Funktions- und Variablenanmerkungen zur Definitionszeit nicht mehr ausgewertet. Stattdessen wird eine Zeichenfolgenform im jeweiligen Anmerkungswörterbuch beibehalten . Statische Typprüfungen sehen keinen Unterschied im Verhalten, während Tools, die zur Laufzeit Anmerkungen verwenden, eine verzögerte Auswertung durchführen müssen.
Das Zeichenfolgenformular wird während des Kompilierungsschritts vom AST abgerufen. Dies bedeutet, dass das Zeichenfolgenformular möglicherweise nicht die genaue Formatierung der Quelle beibehält. Hinweis: Wenn eine Anmerkung bereits ein Zeichenfolgenliteral war, wird sie weiterhin in eine Zeichenfolge eingeschlossen.