Dépendances circulaires dues aux indications de type
Avec les indications de type, les possibilités de créer des importations circulaires sont plus nombreuses. Heureusement, il existe une solution utilisant la constante spéciale : typing.TYPE_CHECKING
.
L'exemple suivant définit un Vertex
et une classe Edge
classe. Une arête est définie par deux sommets et un sommet maintient une liste des arêtes adjacentes auxquelles il appartient.
Sans indication de type, pas d'erreur
Fichier : vertex.py
class Vertex:
def __init__(self, label):
self.label = label
self.adjacency_list = []
Fichier : edge.py
class Edge:
def __init__(self, v1, v2):
self.v1 = v1
self.v2 = v2
Type Indications Cause ImportError
ImportError : cannot import name 'Edge' from partially initialized module 'edge' (probably due to a circular import)
Fichier : 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] = []
Fichier : edge.py
from vertex import Vertex
class Edge:
def __init__(self, v1: Vertex, v2: Vertex):
self.v1 = v1
self.v2 = v2
Solution utilisant TYPE_CHECKING
Fichier : 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'] = []
Fichier : 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
Conseils sur les types de titres cotés et non cotés
Dans les versions de Python antérieures à la 3.10, les types importés conditionnellement doivent être placés entre guillemets, ce qui en fait des "références directes", qui les dissimulent à l'interpréteur en cours d'exécution.
Dans Python 3.7, 3.8 et 3.9, une solution de contournement consiste à utiliser l'importation spéciale suivante.
from __future__ import annotations
Cela permet d'utiliser des indications de type non cotées combinées à des importations conditionnelles.
Dans Python 3.10, les annotations de fonctions et de variables ne seront plus évaluées au moment de la définition. Au lieu de cela, une forme de chaîne sera préservée dans le fichier annotations dictionnaire. Les vérificateurs de types statiques ne verront aucune différence de comportement, tandis que les outils utilisant des annotations au moment de l'exécution devront améliorer leur performance. devront effectuer une évaluation différée.
La forme chaîne est obtenue à partir de l'AST lors de l'étape de compilation, ce qui signifie que la forme chaîne peut ne pas préserver le formatage exact de l'AST. formatage exact de la source. Note : si une annotation était déjà une chaîne littérale elle sera toujours enveloppée dans une chaîne de caractères.
1 votes
Peut-être pourriez-vous essayer les importations relatives ? stackoverflow.com/questions/72852/
1 votes
Ceci peut aider ncoghlan_devs-python-notes.readthedocs.org/fr/latest/
0 votes
Également à titre de référence, il semble que les importations circulaires soient autorisées sous Python 3.5 (et probablement au-delà) mais pas sous 3.4 (et probablement en dessous).
1 votes
Si l'erreur d'importation est détectée, tout se passera bien tant que vous n'aurez pas besoin d'utiliser quoi que ce soit dans l'autre module avant que l'importation du premier module ne soit terminée.
0 votes
Duplicata possible de Importations circulaires (ou cycliques) en Python