Associez Python Enum à une fonction pour la rendre appelable

Lorsque vous souhaitez sélectionner un algorithme parmi plusieurs options, vous pouvez associer une fonction à chaque valeur du type d'énumération.

En Java, vous pouvez définir une méthode pour chaque valeur d'un type d'énumération, mais en Python, vous ne pouvez pas. Réfléchissons à la façon de l'écrire proprement dans le sens de rendre Enum lui-même Callable.

Si la valeur n'a pas d'importance

La valeur d'Enum en Python peut être définie librement. Par conséquent, la valeur elle-même doit être transformée en fonction.

Cependant, la fonction définie dans la classe qui hérite Enum est considérée comme une méthode et n'est pas incluse dans les valeurs répertoriées.

class Dame(Enum):
    #Vous n'avez pas défini la valeur, vous avez défini la méthode
    A = lambda: print("A")

list(Dame)
#Liste vide

Alors, j'ai emprunté cette idée de stackoverflow et j'ai décidé d'utiliser le taple contenant la fonction comme valeur.

from enum import Enum

class CallableEnum(Enum):
    """
Hériter de cette classe pour créer une énumération appelable
    """
    def __call__(self, *args,**kwargs):
        return self.value[0](*args,**kwargs)

def register(func):
    """
Décorateur pour définir facilement le tuple qui contient la fonction
    """
    return func,

Voici comment l'utiliser.

class Test(CallableEnum):
    @register
    def A():
        print("A")
    
    @register
    def B():
        print("B")

Test.A()
# A

Si vous souhaitez définir la valeur librement

Donnez à la classe T qui hérite Enum un dictionnaire de T à la fonction, et faites-y référence dans __call__.

Cependant, si «« T »au dictionnaire de fonctions» est inclus en tant qu'attribut de «T» dans la définition de classe, ce sera également l'une des valeurs énumérées. Vous devez l'ajouter après que T soit terminé en tant que classe.

Par conséquent, c'est une manière d'écrire pour ajouter une fonction une fois la définition de classe terminée.

from enum import Enum

class Dnum(Enum):
    """
Dispatching Enum. Hériter de ce gars
    """
    @classmethod
    def register(cls, key):
        if not hasattr(cls, "table"):
            cls.table = {}
        def registration(func):
            cls.table[key] = func
        return registration
    
    def __call__(self, *args,**kwargs):
        return self.__class__.table[self](*args,**kwargs)


def register(enum):
    def ret(func):
        enum.__class__.register(enum)(func)
    return ret

Utilisez-le comme ça.

from enum import auto

class Test(Dnum):
    A = "A"
    B = "B"

@register(Test.A)
def _A():
    print("A")

@register(Test.B)
def _B():
    print("B")

Test.A()
# A

Existe-t-il une astuce pour écrire une fonction dans la définition de classe tout en définissant la valeur librement?

Recommended Posts

Associez Python Enum à une fonction pour la rendre appelable
Créez un arbre de décision à partir de 0 avec Python et comprenez-le (4. Structure des données)
Faites une loterie avec Python
[Pratique] Créez une application Watson avec Python! # 2 [Fonction de traduction]
Essayez de créer un jeu simple avec Python 3 et iPhone
Faisons une interface graphique avec python.
[Python] Faire de la fonction une fonction lambda
Créer un système de recommandation avec python
Faisons un graphe avec python! !!
Comment créer une caméra de surveillance (caméra de sécurité) avec Opencv et Python
Créez un simple OMR (lecteur de feuille de marque) avec Python et OpenCV
Créez un thermomètre avec Raspberry Pi et rendez-le visible sur le navigateur Partie 4
J'ai essayé de faire un processus d'exécution périodique avec Selenium et Python
Créez une application de scraping avec Python + Django + AWS et modifiez les tâches
Créer un décorateur de fonction Python avec Class
Fractal pour faire et jouer avec Python
Un mémo contenant Python2.7 et Python3 dans CentOS
Faisons la voix lentement avec Python
Créez un framework Web avec Python! (1)
Créez une application de bureau avec Python avec Electron
Faisons un bot Twitter avec Python!
Créez un framework Web avec Python! (2)
Définissez la fonction Lambda et laissez-la fonctionner avec les événements S3!
Créez un arbre de décision à partir de 0 avec Python et comprenez-le (5. Entropie des informations)
Créer un bot Twitter Trend avec heroku + Python
Construire un environnement python avec virtualenv et direnv
Je veux faire un jeu avec Python
Essayez de créer un code de "décryptage" en Python
J'ai essayé la synthèse de fonctions et le curry avec python
Lancer un serveur Web avec Python et Flask
Remplaçons UWSC par Python (5) Faisons un robot
Écrivons un programme Python et exécutons-le
Essayez de créer un groupe de dièdre avec Python
[# 1] Créez Minecraft avec Python. ~ Recherche préliminaire et conception ~
J'ai essayé de faire un processus périodique avec CentOS7, Selenium, Python et Chrome
Fabriquez un thermomètre avec Raspberry Pi et rendez-le visible sur le navigateur Partie 3
Transformez un programme Python en démon et exécutez-le automatiquement au démarrage du système d'exploitation
Divisez chaque diapositive PowerPoint en un fichier JPG et exportez-le avec python
WEB grattage avec python et essayez de créer un nuage de mots à partir des critiques
Obtenez le cours de l'action d'une entreprise japonaise avec Python et faites un graphique
Faire un décorateur de fonction
Combinez des chaînes répétitives en une seule avec des expressions régulières Python.
Créez un environnement virtuel python avec virtualenv et virtualenvwrapper
Faisons un Makefile et construisons-le (super débutant)
Installez le sélénium sur votre Mac et essayez-le avec python
[Pratique] Créez une application Watson avec Python! # 1 [Discrimination linguistique]
Créez un Slackbot simple avec un bouton interactif en python
[Jouons avec Python] Créer un livre de comptes de ménage
[# 2] Créez Minecraft avec Python. ~ Dessin du modèle et implémentation du lecteur ~
Faire un point d'arrêt sur la couche c avec python
Créer une fonction pour décrire les polices japonaises avec OpenCV
Exploration avec Python et Twitter API 1 - Fonction de recherche simple
J'ai essayé de faire LINE BOT avec Python et Heroku
Créez un environnement virtuel python avec virtualenv et virtualenvwrapper
Créer un outil de formatage CSV avec Python Pandas Py Installer
Recevoir des e-mails de Gmail et étiqueter avec Python3