Instruction 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 :
# 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):
...
Dans cet exemple, la constante TYPE_CHECKING de Python est utilisée 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 :
# 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'):
...
Ici, 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 version ultérieure pour fonctionner efficacement avec les indications de type.
N'oubliez pas que l'utilisation de mixins et d'indications 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.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3