En Python moderne (3.10+), from __future__ import annotations et if TYPE_CHECKING ne s'opposent pas, ils sont complémentaires et souvent utilisés ensemble dans du code idiomatique.
from future import annotations
- Rend toutes les annotations paresseuses (lazy) en les stockant sous forme de chaînes de caractères, évitant ainsi l'évaluation immédiate des types au moment du parsing du module.
- Cela évite les imports circulaires dans les annotations uniquement, sans avoir besoin de quotes autour des noms de classes.
- Utile pour tous les usages d’annotations, même en dehors des blocs conditionnels.
if TYPE_CHECKING
- Ce bloc permet d’importer des modules ou classes uniquement pour les outils de typage statique (mypy, pyright, etc.), sans exécuter l'import à runtime.
- Cela permet d’éviter les imports inutiles ou coûteux au runtime, tout en satisfaisant les vérificateurs de type.
- Nécessaire même avec
from __future__ import annotationssi tu veux éviter l’import réel d’un module ou d’une classe à l’exécution.
Note : compatibilité avec l’API typing
Même avec from __future__ import annotations, certains types issus de typing (ex. Union, Optional, List, etc.) peuvent poser problème dans certains contextes (ex. introspection, get_type_hints, ou runtime validation comme avec Pydantic).
- Exemple :
Optional["MyClass"]fonctionne bien avecfrom __future__ import annotations, mais attention siMyClassest utilisé directement dans du code d’exécution (ex.isinstance(obj, MyClass))dans ce cas, l’import réel est requis. - Autre point : certains usages dynamiques (ex. analyse via
typing.get_args()) nécessitent que les annotations soient des objets, pas des chaînes. Il faudra donc explicitement les évaluer viatyping.get_type_hints.
En pratique, on combine souvent les deux :
from __future__ import annotations
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from .manager import WorkflowManager # pas chargé au runtime
class Workflow:
def __init__(self, manager: WorkflowManager): # annotations évaluées paresseusement
self.manager = manager
Conclusion
from __future__ import annotations résout le problème de l’évaluation prématurée des annotations.
if TYPE_CHECKING évite l’exécution réelle de l’import pendant l’exécution.
Les deux sont donc idiomatiques et recommandés ensemble dans du code moderne, surtout dans les projets structurés ou modulaires où les imports circulaires sont fréquents.