Verknüpfen Sie Python Enum mit einer Funktion, um es aufrufbar zu machen

Wenn Sie einen Algorithmus aus mehreren Optionen auswählen möchten, möchten Sie möglicherweise jedem Wert des Aufzählungstyps eine Funktion zuordnen.

In Java können Sie für jeden Wert eines Aufzählungstyps eine Methode festlegen, in Python jedoch nicht. Lassen Sie uns darüber nachdenken, wie man es ordentlich schreibt, um Enum selbst Callable zu machen.

Wenn der Wert keine Rolle spielt

Der Wert von Enum in Python kann frei festgelegt werden. Daher sollte der Wert selbst zu einer Funktion gemacht werden.

Die in der Klasse, die Enum erbt, definierte Funktion wird jedoch als Methode beurteilt und ist in den aufgelisteten Werten nicht enthalten.

class Dame(Enum):
    #Sie haben den Wert nicht definiert, Sie haben die Methode definiert
    A = lambda: print("A")

list(Dame)
#Leere Liste

Also habe ich mir diese Stackoverflow-Idee ausgeliehen und mich entschieden, den Taple mit der Funktion als Wert zu verwenden.

from enum import Enum

class CallableEnum(Enum):
    """
Erben Sie diese Klasse, um eine aufrufbare Aufzählung zu erstellen
    """
    def __call__(self, *args,**kwargs):
        return self.value[0](*args,**kwargs)

def register(func):
    """
Decorator zum einfachen Definieren des Tupels, das die Funktion enthält
    """
    return func,

Hier erfahren Sie, wie Sie es verwenden.

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

Test.A()
# A

Wenn Sie den Wert frei einstellen möchten

Geben Sie der Klasse "T", die Enum erbt, ein Wörterbuch von "T" für die Funktion und verweisen Sie in "call" darauf.

Wenn jedoch " T to function dictionary "als Attribut von T in der Klassendefinition enthalten ist, ist dies auch einer der aufgezählten Werte. Sie müssen es hinzufügen, nachdem T als Klasse abgeschlossen ist.

Daher können Sie nach Abschluss der Klassendefinition eine Funktion hinzufügen.

from enum import Enum

class Dnum(Enum):
    """
Enum versenden. Erben Sie diesen Kerl
    """
    @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

Verwenden Sie es so.

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

Gibt es einen Trick, um eine Funktion in die Klassendefinition zu schreiben, während der Wert frei eingestellt wird?

Recommended Posts

Verknüpfen Sie Python Enum mit einer Funktion, um es aufrufbar zu machen
Machen Sie mit Python einen Entscheidungsbaum von 0 und verstehen Sie ihn (4. Datenstruktur)
Machen Sie eine Lotterie mit Python
[Übung] Erstellen Sie eine Watson-App mit Python! # 2 [Übersetzungsfunktion]
Versuchen Sie, ein einfaches Spiel mit Python 3 und iPhone zu erstellen
Lassen Sie uns eine GUI mit Python erstellen.
[Python] Machen Sie die Funktion zu einer Lambda-Funktion
Erstellen Sie ein Empfehlungssystem mit Python
Lassen Sie uns ein Diagramm mit Python erstellen! !!
So erstellen Sie eine Überwachungskamera (Überwachungskamera) mit Opencv und Python
Erstellen Sie mit Python und OpenCV ein einfaches OMR (Mark Sheet Reader)
Machen Sie ein Thermometer mit Raspberry Pi und machen Sie es im Browser Teil 4 sichtbar
Ich habe versucht, mit Selenium und Python einen regelmäßigen Ausführungsprozess durchzuführen
Erstellen Sie mit Python + Django + AWS eine Scraping-App und wechseln Sie Jobs
Erstellen Sie mit Class einen Python-Funktionsdekorator
Fraktal zum Erstellen und Spielen mit Python
Ein Memo mit Python2.7 und Python3 in CentOS
Lassen Sie uns mit Python langsam sprechen
Erstellen Sie ein Webframework mit Python! (1)
Erstellen Sie eine Desktop-App mit Python mit Electron
Machen wir einen Twitter-Bot mit Python!
Erstellen Sie ein Webframework mit Python! (2)
Stellen Sie die Lambda-Funktion ein und lassen Sie sie mit S3-Ereignissen arbeiten!
Erstellen Sie mit Python einen Entscheidungsbaum von 0 und verstehen Sie ihn (5. Information Entropy)
Machen Sie Twitter Trend Bot mit Heroku + Python
Erstellen einer Python-Umgebung mit virtualenv und direnv
Ich möchte ein Spiel mit Python machen
Versuchen Sie, in Python einen "Entschlüsselungs" -Code zu erstellen
Ich habe Funktionssynthese und Curry mit Python versucht
Starten Sie einen Webserver mit Python und Flask
Ersetzen wir UWSC durch Python (5) Machen wir einen Roboter
Schreiben wir ein Python-Programm und führen es aus
Versuchen Sie, mit Python eine Diedergruppe zu bilden
[# 1] Mach Minecraft mit Python. ~ Vorforschung und Design ~
Ich habe versucht, einen periodischen Prozess mit CentOS7, Selenium, Python und Chrome durchzuführen
Machen Sie ein Thermometer mit Raspberry Pi und machen Sie es im Browser Teil 3 sichtbar
Machen Sie aus einem Python-Programm einen Daemon und führen Sie es automatisch aus, wenn das Betriebssystem gestartet wird
Teilen Sie jede PowerPoint-Folie in eine JPG-Datei und geben Sie sie mit Python aus
WEB Scraping mit Python und versuchen, aus Bewertungen eine Wortwolke zu machen
Holen Sie sich mit Python den Aktienkurs eines japanischen Unternehmens und erstellen Sie eine Grafik
Machen Sie einen Funktionsdekorateur
Kombinieren Sie sich wiederholende Zeichenfolgen mit regulären Python-Ausdrücken zu einer.
Erstellen Sie eine virtuelle Python-Umgebung mit virtualenv und virtualenvwrapper
Lass uns ein Makefile machen und es bauen (super Anfänger)
Installieren Sie Selenium auf Ihrem Mac und probieren Sie es mit Python aus
[Übung] Erstellen Sie eine Watson-App mit Python! # 1 [Sprachdiskriminierung]
Erstellen Sie einen einfachen Slackbot mit einer interaktiven Schaltfläche in Python
[Lass uns mit Python spielen] Ein Haushaltsbuch erstellen
[# 2] Mach Minecraft mit Python. ~ Modellzeichnung und Player-Implementierung ~
Machen Sie mit Python einen Haltepunkt auf der c-Ebene
Erstellen Sie mit OpenCV eine Funktion zum Beschreiben japanischer Schriftarten
Crawlen mit Python und Twitter API 1-Einfache Suchfunktion
Ich habe versucht, LINE BOT mit Python und Heroku zu machen
Erstellen Sie eine virtuelle Python-Umgebung mit virtualenv und virtualenvwrapper
Erstellen Sie mit Python Pandas Py Installer ein CSV-Formatierungswerkzeug
Erhalten Sie E-Mails von Google Mail und beschriften Sie sie mit Python3