Maison >développement back-end >Tutoriel Python >Comment puis-je gérer correctement les indications de type pour les classes fermées en Python ?

Comment puis-je gérer correctement les indications de type pour les classes fermées en Python ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-18 00:35:11324parcourir

How Can I Properly Handle Type Hints for Enclosed Classes in Python?

Gestion des conseils 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 :

  • Si vous utilisez des définitions factices ou un patch singe pour ajouter des annotations, assurez-vous que les annotations refléter avec précision le type de la classe.
  • Dans Python 3.10, l'évaluation reportée des annotations devait devenir la valeur par défaut, mais elle a depuis été reportée à une version ultérieure.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn