Indice de type en Python sans importations cycliques
Dans une tentative de diviser une grande classe en deux classes plus petites, vous rencontrez le problème des classes cycliques. importations. La classe "main" importe la classe mixin et la classe mixin fait référence à la classe "main" dans son indice de type. Cela entraîne un cycle d'importation, empêchant l'indication de type de fonctionner correctement.
Pour résoudre ce problème, vous pouvez envisager l'approche suivante :
<code class="python"># 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): ...</code>
<code class="python"># 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): ...</code>
Dans cet exemple, TYPE_CHECKING de Python constant est utilisé pour importer conditionnellement la classe "principale". Lors de l'exécution du code, l'instruction d'importation est ignorée car la constante est False. Cependant, les outils de vérification de type comme mypy interprètent le code dans le bloc if TYPE_CHECKING et reconnaissent l'annotation de type pour func2.
Une autre approche consiste à utiliser une référence directe :
<code class="python"># 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'): ...</code>
Ici, le l'annotation de type pour func2 est une chaîne représentant le nom de la classe qui sera importée ultérieurement. Les deux approches nécessitent l'utilisation de Python 3.7 ou supérieur pour fonctionner efficacement avec les indices de type.
N'oubliez pas que l'utilisation de mixins et d'indices de type peut nécessiter une structuration supplémentaire dans votre code. Par exemple, mypy recommande de créer une classe de base abstraite (ABC) dont héritent vos classes "principales" et mixin. Cela peut améliorer la précision de la vérification de type.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!