亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

Table des matières
1. Premiers enjeux et défis
2. Solution?: méthode _missing_
3. Implémentez la méthode _missing_
4. Utilisation et vérification
5. Précautions et bonnes pratiques
Résumer
Maison développement back-end Tutoriel Python Gestion flexible des entrées Python Enum?: une compréhension plus approfondie de la méthode _missing_

Gestion flexible des entrées Python Enum?: une compréhension plus approfondie de la méthode _missing_

Oct 16, 2025 am 09:36 AM

Gestion flexible des entrées Python Enum?: une compréhension plus approfondie de la méthode _missing_

Cet article explique comment gérer diverses valeurs d'entrée avec élégance en rempla?ant la méthode de classe _missing_ dans la classe Python enum.Enum. Même si la valeur interne d'un membre d'énumération est fixe, nous pouvons lui faire accepter plusieurs représentations externes (telles que "vrai", "oui", etc.) et le mapper au bon membre d'énumération tout en gardant la valeur interne d'origine inchangée, améliorant ainsi la robustesse et la convivialité de l'énumération.

Dans le développement Python, enum.Enum fournit un moyen puissant de définir une collection de constantes. Cependant, dans les applications pratiques, nous sommes souvent confrontés à un défi : comment permettre aux énumérations d'accepter plusieurs formes d'entrée et de les mapper uniformément à des membres spécifiques de l'énumération tout en gardant inchangées les valeurs internes des membres de l'énumération eux-mêmes. Par exemple, une énumération représentant ? oui/non ? peut avoir ses valeurs internes définies comme ? Y ? et ? N ?, mais lors de la réception d'une entrée externe, elle peut avoir besoin de reconna?tre plusieurs formes telles que ? vrai ?, ? oui ? ou même ? T ? comme signification de ? oui ?.

Cet article utilisera un cas spécifique pour présenter en détail comment utiliser la méthode de classe _missing_ d'enum.Enum pour résoudre ce problème et obtenir un traitement d'entrée flexible.

1. Premiers enjeux et défis

Supposons que nous définissions une énumération YesOrNo pour représenter ? oui ? ou ? non ??:

 importer une énumération

classe OuiOuNon(enum.Enum):
  OUI = "O"
  NON = "N"

Nous espérons que lorsque l'entrée externe est "Y" ou "N", le membre d'énumération correspondant pourra être créé directement. Par exemple, YesOrNo("Y") peut obtenir YesOrNo.YES. Cette partie de la fonctionnalité est prise en charge par enum.Enum par défaut.

Cependant, que se passe-t-il si notre système doit accepter un plus large éventail d'entrées, telles que "vrai" ou "faux", et les mapper à YesOrNo.YES et YesOrNo.NO, tout en exigeant que YesOrNo.YES.value soit toujours "Y" et YesOrNo.NO.value soit toujours "N". Essayer directement YesOrNo("true") générera une ValueError car "true" ne fait pas partie des valeurs de OUI ou de NON.

Une approche intuitive mais indésirable consiste à modifier la définition de l’énumération?:

 # La modification n'est pas recommandée car elle changera la valeur interne de la classe d'énumération YesOrNo(enum.Enum)?:
  OUI = "vrai"
  NON = "faux"

Bien que cette modification fasse fonctionner YesOrNo("true"), YesOrNo.YES.value deviendra "true" au lieu de "Y" comme prévu, ce qui entre en conflit avec notre besoin de conserver la valeur interne inchangée.

2. Solution?: méthode _missing_

enum.Enum fournit une méthode de classe spéciale appelée _missing_, con?ue pour gérer les situations dans lesquelles la valeur transmise au constructeur d'énumération ne peut correspondre directement à aucun membre de l'énumération. En rempla?ant cette méthode, nous pouvons implémenter une logique de recherche personnalisée pour mapper les entrées non standard aux membres d'énumération corrects.

La signature d'une méthode _missing_ est généralement _missing_(cls, value), où cls est la classe d'énumération elle-même et value est la valeur sans correspondance qui a été transmise au constructeur. La méthode doit renvoyer le membre d'énumération correspondant et doit autoriser le comportement par défaut (lancer ValueError) ou lancer explicitement une exception si une correspondance ne peut pas être trouvée.

3. Implémentez la méthode _missing_

Voici l'implémentation complète utilisant la méthode _missing_ pour résoudre le problème ci-dessus?:

 importer une énumération

classe OuiOuNon(enum.Enum):
    OUI = "O"
    NON = "N"

    @méthodeclasse
    def _missing_(cls, valeur)?:
        """
        Cette méthode est appelée lorsque la valeur transmise ne correspond directement à aucun membre de l’énumération.
        Il tente de mapper diverses formes d'entrée sur les membres de l'énumération OUI ou NON.
        """
        # Convertir la valeur d'entrée en minuscules pour une comparaison insensible à la casse normalized_value = str(value).lower()

        si valeur_normalisée dans ('y', 'oui', 'true', 't')?:
            retourner cls.OUI
        elif valeur_normalisée dans ('n', 'non', 'false', 'f')?:
            retourner cls.NO

        # Faire enum lancer ValueError par défaut si aucune forme connue ne correspond
        # Ou vous pouvez personnaliser d'autres exceptions à lever # raise ValueError(f"'{value}' n'est pas une valeur YesOrNo valide.")

Analyse des codes?:

  1. @classmethod decorator : _missing_ doit être une méthode de classe car elle opère sur la classe d'énumération elle-même, pas sur une instance.
  2. Paramètre cls : représente la classe d'énumération YesOrNo. Les membres de l’énumération sont accessibles via cls.YES et cls.NO.
  3. paramètre value?: il s'agit de la valeur transmise au constructeur YesOrNo() mais ne correspond directement à aucun membre, par exemple "true".
  4. normalized_value = str(value).lower() : Pour rendre la logique de correspondance plus robuste, nous convertissons la valeur d'entrée en cha?ne et la mettons en minuscule. Cela peut gérer les entrées avec différents cas tels que "Vrai" et "OUI".
  5. Jugement conditionnel :
    • Si normalized_value appartient à l'un des ('y', 'yes', 'true', 't'), renvoyez cls.YES.
    • Si normalized_value est l'un des ('n', 'no', 'false', 'f'), renvoyez cls.NO.
  6. Gestion des correspondances manquantes?: si la méthode _missing_ ne trouve pas de correspondance en interne et renvoie un membre d'énumération, alors enum.Enum lancera ValueError par défaut. Dans l'exemple, nous ne lan?ant pas explicitement mais nous nous appuyons sur ce comportement par défaut. Si vous avez besoin d'informations d'erreur plus spécifiques, vous pouvez augmenter ValueError(...) manuellement.

4. Utilisation et vérification

Maintenant, nous pouvons tester cette énumération YesOrNo améliorée?:

 # Tester diverses entrées print(f"YesOrNo('Y'): {YesOrNo('Y')}")
print(f"OuiOuNon('y'): {OuiOuNon('y')}")
print(f"OuiOuNon('OUI'): {OuiOuNon('OUI')}")
print(f"OuiOuNon('vrai'): {OuiOuNon('vrai')}")
print(f"OuiOuNon('T'): {OuiOuNon('T')}")
print(f"OuiOuNon('N'): {OuiOuNon('N')}")
print(f"OuiOuNon('false'): {OuiOuNon('faux')}")
print(f"OuiOuNon('non'): {OuiOuNon('non')}")

# Vérifiez que les valeurs internes des membres de l'énumération restent inchangées print(f"YesOrNo.YES.value: {YesOrNo.YES.value}")
print(f"OuiOuNo.NO.value?: {OuiOuNo.NO.value}")

# Essayez une entrée invalide?:
    OuiOuNon("inconnu")
sauf ValueError comme e?:
    print(f"Erreur pour 'inconnu'?: {e}")

Exemple de sortie?:

 OuiOuNon('Y'): OuiOuNon.OUI
OuiOuNon('y'): OuiOuNon.OUI
OuiOuNon('OUI'): OuiOuNon.OUI
OuiOuNon('true'): OuiOuNon.OUI
OuiOuNon('T'): OuiOuNon.OUI
OuiOuNon('N'): OuiOuNon.NON
OuiOuNon('faux'): OuiOuNon.NON
OuiOuNon('non'): OuiOuNon.NON
OuiOuNon.OUI.valeur?:?Oui
OuiOuNon.NO.valeur?:?N
Erreur pour ??inconnu???: ??inconnu?? n'est pas un OuiOuNon valide

Il ressort de la sortie que, que ce soit ? vrai ?, ? oui ? ou ? Y ?, il est mappé avec succès à YesOrNo.YES. Pendant ce temps, YesOrNo.YES.value est toujours "Y", ce qui répond à tous nos besoins.

5. Précautions et bonnes pratiques

  • _missing_ n'est appelé que lorsqu'il n'y a pas de correspondance directe : si la valeur transmise peut correspondre directement à la valeur d'un membre de l'énumération, la méthode _missing_ ne sera pas appelée. Par exemple, YesOrNo("Y") renverra directement YesOrNo.YES.
  • Type de retour : La méthode _missing_ doit renvoyer un membre d'énumération (c'est-à-dire sous la forme cls.MEMBER), sinon une erreur de type sera générée.
  • Gestion des exceptions?: cela devrait permettre à enum.Enum de lever une ValueError si le _missing_ ne reconna?t pas la valeur transmise, ou une exception plus spécifique basée sur la logique métier. Ne renvoyez pas None ou d'autres valeurs qui ne sont pas membres de l'énumération.
  • Considérations sur les performances?: pour les très grandes énumérations ou les scénarios d'appels à haute fréquence, la logique dans _missing_ doit être aussi efficace que possible. Si la relation de mappage est complexe, envisagez d'utiliser un dictionnaire pour le précalcul ou la mise en cache.
  • Conversion de type?: dans _missing_, il est généralement recommandé de convertir la valeur en un type uniforme (comme une cha?ne) et de la normaliser (comme .lower()) pour gérer diverses entrées.
  • Note de documentation : lors de la définition d'une énumération contenant une méthode _missing_, il est recommandé que les types d'entrée et les règles de mappage qu'elle gère soient clairement indiqués dans la docstring de la classe ou de la méthode afin que les autres développeurs puissent les comprendre et les utiliser.

Résumer

En rempla?ant la méthode de classe _missing_ d'enum.Enum, nous obtenons un outil puissant qui peut gérer et mapper de manière flexible diverses valeurs d'entrée sans modifier les valeurs internes de l'énumération. Cela améliore considérablement la robustesse et la convivialité des énumérations, permettant à notre code de mieux s'adapter aux changements dans les entrées externes, tout en conservant la cohérence et la clarté du modèle de données interne. La méthode _missing_ est sans aucun doute une solution à considérer lors de la conception d'énumérations devant gérer plusieurs formes d'entrée.

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 de ce site Web
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

Outils d'IA chauds

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Stock Market GPT

Stock Market GPT

Recherche d'investissement basée sur l'IA pour des décisions plus intelligentes

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Stratégie de fusion efficace de l'adaptateur et du modèle de base PEFT LORA Stratégie de fusion efficace de l'adaptateur et du modèle de base PEFT LORA Sep 19, 2025 pm 05:12 PM

Ce tutoriel détaille comment fusionner efficacement l'adaptateur PEFT LORA avec le modèle de base pour générer un modèle complètement indépendant. L'article souligne qu'il est faux d'utiliser directement Transformers.Automodel pour charger l'adaptateur et fusionner manuellement les poids, et fournit le processus correct pour utiliser la méthode Merge_and_unload dans la bibliothèque PEFT. De plus, le tutoriel souligne également l'importance de traiter les segments de mots et discute des problèmes et des solutions de compatibilité des versions de PEFT.

Comment installer des packages à partir d'un fichier exigence.txt dans Python Comment installer des packages à partir d'un fichier exigence.txt dans Python Sep 18, 2025 am 04:24 AM

Exécutez pipinstall-rrequirements.txt pour installer le package de dépendance. Il est recommandé de créer et d'activer l'environnement virtuel d'abord pour éviter les conflits, s'assurer que le chemin du fichier est correct et que le PIP a été mis à jour et utiliser des options telles que --No-Deps ou --User pour ajuster le comportement d'installation si nécessaire.

Comment tester le code Python avec Pytest Comment tester le code Python avec Pytest Sep 20, 2025 am 12:35 AM

Python est un outil de test simple et puissant dans Python. Après l'installation, les fichiers de test sont automatiquement découverts en fonction des règles de dénomination. écrivez une fonction commen?ant par test_ pour les tests d'assurance, utilisez @ pytest.fixture pour créer des données de test réutilisables, vérifiez les exceptions via PyTest.Rais, prend en charge l'exécution de tests spécifiés et plusieurs options de ligne de commande et améliore l'efficacité des tests.

Comment gérer les arguments de ligne de commande dans Python Comment gérer les arguments de ligne de commande dans Python Sep 21, 2025 am 03:49 AM

TheargParsemoduleisthereComMendwaytoHandleCommand-lineargumentsInpython, fournissantRobustParsing, Typevalidation, HelpMessages, AnderrorHling; usys.argvforsimplécasesrequiringminimalsepup.

Problème de précision du nombre de points flottants dans Python et son schéma de calcul de haute précision Problème de précision du nombre de points flottants dans Python et son schéma de calcul de haute précision Sep 19, 2025 pm 05:57 PM

Cet article vise à explorer le problème commun de la précision de calcul insuffisante des nombres de points flottants dans Python et Numpy, et explique que sa cause profonde réside dans la limitation de représentation des nombres de points flottants 64 bits standard. Pour les scénarios informatiques qui nécessitent une précision plus élevée, l'article introduira et comparera les méthodes d'utilisation, les fonctionnalités et les scénarios applicables de bibliothèques mathématiques de haute précision telles que MPMATH, SYMPY et GMPY pour aider les lecteurs à choisir les bons outils pour résoudre les besoins de précision complexe.

Comment fusionner correctement l'adaptateur PEFT LORA avec modèle de base Comment fusionner correctement l'adaptateur PEFT LORA avec modèle de base Sep 17, 2025 pm 02:51 PM

Cet article détaille comment utiliser la fonction Merge_and_Unload de la bibliothèque PEFT pour fusionner efficacement et avec précision l'adaptateur LORA dans le modèle de base de base, créant ainsi un tout nouveau modèle avec des connaissances affineuses intégrées. L'article corrige les malentendus courants sur le chargement des adaptateurs et la fusion manuelle des poids des modèles via Transformers.

Comment pouvez-vous créer un gestionnaire de contexte en utilisant le décorateur @contextManager dans Python? Comment pouvez-vous créer un gestionnaire de contexte en utilisant le décorateur @contextManager dans Python? Sep 20, 2025 am 04:50 AM

Importer @ contextManagerfromContextLibandDeFineAgeneratorFonctionnement toTyieldSexactlyOnce, où les actes de championnalsAnterAndCodeLifteryiel

Comment travailler avec les fichiers PDF dans Python Comment travailler avec les fichiers PDF dans Python Sep 20, 2025 am 04:44 AM

PYPDF2, PDFPLUMBER et FPDF sont les bibliothèques de base pour Python pour traiter PDF. Utilisez le PYPDF2 pour effectuer l'extraction de texte, la fusion, la division et le chiffrement, tels que la lecture de la page via Pdfreader et l'appel extract_text () pour obtenir du contenu; PDFPLUMBER convient plus pour conserver l'extraction de texte de mise en page et la reconnaissance de la table, et prend en charge extract_tables () pour capturer avec précision les données de table; FPDF (FPDF2 recommandé) est utilisé pour générer du PDF, et les documents sont construits et sorties via add_page (), set_font () et cellule (). Lors de la fusion des PDF

See all articles