Maison >développement back-end >Tutoriel Python >Comment puis-je gérer correctement les indications de type pour les classes fermées en Python ?
Comprendre le problème
Lors de la définition d'une méthode qui fait référence à l'élément englobant class comme type de retour, vous pouvez rencontrer une erreur de référence non résolue. Considérons le code suivant dans Python 3 :
class Position: def __init__(self, x: int, y: int): self.x = x self.y = y def __add__(self, other: Position) -> Position: return Position(self.x + other.x, self.y + other.y)
Ce code échoue avec une NameError car la classe Position n'est pas définie dans la portée de la méthode __add__.
Résoudre le Problème
Python 3.11 avec 'Self' Tapez :
Dans Python 3.11 et les versions ultérieures, vous pouvez utiliser le type Self pour référencer la classe englobante dans les indications de type :
from typing import Self class Position: def __add__(self, other: Self) -> Self: return Position(self.x + other.x, self.y + other.y)
Python 3.7 avec '__future__ import annotations' :
Si vous utilisez Python 3.7 ou plus récent, vous pouvez activer l'évaluation différée des annotations en ajoutant l'instruction d'importation suivante :
from __future__ import annotations
Une fois cette option activée, les indications de type seront stockées sous forme de chaînes jusqu'à ce que le module soit complètement chargé, résolvant ainsi le problème de référence :
class Position: def __add__(self, other: Position) -> Position: return Position(self.x + other.x, self.y + other.y)
Python <3.7 :
Pour les versions Python ci-dessous 3.7, vous pouvez spécifier une référence de chaîne à la classe englobante à l'aide de guillemets simples :
class Position: def __add__(self, other: 'Position') -> 'Position': return Position(self.x + other.x, self.y + other.y)Cela crée une référence directe qui sera résolue une fois la classe définie.
Supplémentaire Remarques :
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!