[Python] Beseitigen Sie bedingte Verzweigungen, indem Sie Enum und eval vollständig nutzen

Auslösen

Ich war beeindruckt, als ich Mr. Masudas Wie schreibe ich "Fallklassifizierung" las. Alles begann mit Versuch und Irrtum und fragte sich, ob dies mit Python möglich wäre. Ich wollte es in meinen eigenen Notizen behalten, aber ich dachte, dass einige Leute vielleicht ähnliche Probleme haben könnten, Ich habe beschlossen zu posten.

Bei Verwendung von if

Betrachten Sie als Beispiel den Code, um den Bereich einer Figur zu finden.

def calculate_area(shape_type, shape_info):
    if shape_type == 'triangle':
        return shape_info['bottom'] * shape_info['height'] / 2

    if shape_type == 'rectangle':
        return shape_info['bottom'] * shape_info['height']

Ich bin nicht glücklich darüber, dass die Anzahl der if-Anweisungen in der Funktion mit zunehmender Anzahl von Zahlen zunimmt. (Dies ist ein einfaches Beispiel, aber es ist schwierig zu beheben, wenn es verschachtelt ist.)

Klasse vorbereiten

Lassen Sie uns als vorläufige Vorbereitung eine Klasse für jede Figur vorbereiten.

from abc import ABCMeta, abstractmethod

class Shape(metaclass=ABCMeta):
    def __init__(self, shape_info):
        self.shape_info = shape_info

    @abstractmethod
    def calculate_area(self):
        pass

class Triangle(Shape):
    def calculate_area(self):
        return self.shape_info['bottom'] * self.shape_info['height'] / 2

class Rectangle(Shape):
    def calculate_area(self):
        return self.shape_info['bottom'] * self.shape_info['height']

Wir haben die Triangle-Klasse und die Rectangle-Klasse vorbereitet. Wenn dies jedoch alles ist, mit welcher Klasse wird beim Aufruf für jeden shape_type instanziiert Es scheint notwendig zu sein, die Fälle zu trennen.

if shape_type == 'triangle':
    shape = Triangle(shape_info)

if shape_type == 'rectangle':
    shape = Rectangle(shape_info)

Verwenden Sie Enum und eval

Mit Enum können Shape_Type und Klassenname verknüpft werden. Mit eval können Sie den Inhalt eines Strings so ausführen, wie er als Python-Syntax vorliegt.

class ShapeType(Enum):
    triangle = 'Triangle'
    rectangle = 'Rectangle'

    @classmethod
    def get_shape_instance(cls, shape_type, shape_info):
        return eval(cls[shape_type].value)(shape_info)

Wenn Sie es so schreiben, kennen Sie die Implementierungsklasse nicht. Sie können ShapeType wie eine Schnittstelle verwenden. Beim Anruf wird es wie folgt sein.

shape = ShapeType.get_shape_instance(shape_type, shape_info)

Schließlich

Weil dies mein erster Beitrag ist und ich noch studiere Der Text enthält möglicherweise einige Mängel, aber bitte verzeihen Sie mir. Ich hoffe dieser Artikel hilft jemandem.

Recommended Posts

[Python] Beseitigen Sie bedingte Verzweigungen, indem Sie Enum und eval vollständig nutzen
Bedingte Verzweigung von Python mit Chemoinfomatik gelernt
[Einführung in Data Scientists] Grundlagen von Python ♬ Bedingte Verzweigung und Schleifen
Extraktion von tweet.js (json.loads und eval) (Python)
Ich möchte die legendäre Nintendo-Kombination wiederbeleben, indem ich AI und HR Tech voll ausnütze!
Vollständiges Verständnis von Python-Threading und Multiprocessing
Python-Entwicklungsumgebung - Verwendung von Pyenv und Virtualenv-
Python> Nach Nummer sortieren und nach Alphabet sortieren> Sortiert verwenden ()
Asynchrone Verarbeitung von Python ~ Asynchron vollständig verstehen und warten ~
Paiza Python Primer 2: Lernen Sie bedingte Verzweigungs- und Vergleichsoperatoren
[Python of Hikari-] Kapitel 08-03 Modul (Import und Verwendung der Standardbibliothek)
Anwendung von Python: Datenbereinigung Teil 3: Verwendung von OpenCV und Vorverarbeitung von Bilddaten
[Python] Zusammenfassung der Verwendung von Split- und Join-Funktionen
Vergleich der Verwendung von Funktionen höherer Ordnung in Python 2 und 3
[Python of Hikari-] Kapitel 05-07 Steuerungssyntax (bedingte Verzweigung der Einschlussnotation)
Der Prozess, Python-Code objektorientiert zu machen und zu verbessern
[Du musst es wissen! ] Ich habe versucht, eine Python-Umgebung gewinnbringend einzurichten, indem ich die Privilegien von Universitätsstudenten voll ausgenutzt habe.