Type indiquant une méthode avec le type de classe englobant
En Python, il est possible de taper des méthodes d'indication pour spécifier les types attendus de leurs arguments et renvoyer des valeurs. Cependant, lorsque vous utilisez des méthodes qui font référence au type de classe englobant, vous pouvez rencontrer des ambiguïtés en raison de la nature dynamique de Python.
Le problème avec les références avancées
Considérez le extrait de code suivant :
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)
Ici, la méthode __add__ attend une autre instance de Position comme argument et renvoie une Position exemple. Cependant, Python n'autorise pas les références directes dans les indications de type, donc l'utilisation du nom de classe Position directement dans les annotations entraînera une erreur.
Utilisation de « Self » pour les références directes (Python 3.11)
Avec l'introduction du PEP 673 dans Python 3.11, le type Self est disponible depuis le module de saisie. L'utilisation de Self permet de transmettre des références au type de classe englobant :
from typing import Self class Position: def __init__(self, x: int, y: int): self.x = x self.y = y def __add__(self, other: Self) -> Self: return Position(self.x + other.x, self.y + other.y)
Utilisation de 'from futur importer des annotations' (Python 3.7)
Dans Python 3.7 et versions ultérieures, l'instruction future des annotations from __future__ import permet une évaluation différée de annotations. Cela signifie que les annotations de type seront stockées sous forme de chaînes et évaluées ultérieurement lorsque le module sera complètement chargé :
from __future__ import annotations 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)
Utilisation de chaînes pour les références directes (versions Python antérieures à 3.7)
Avant Python 3.7, l'utilisation de chaînes au lieu de noms de classe était l'approche recommandée pour le transfert références :
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)
Cela fonctionnera tant que la définition de classe est trouvée avant que ces indices de type ne soient rencontrés. Cependant, il est important de noter que l'utilisation de chaînes pour l'indication de type peut ne pas être prise en charge par tous les éditeurs de code ou outils d'analyse.
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!