[PYTHON] Verwenden Sie get so viel wie möglich für Referenzen vom Typ Wörterbuch

Zwei Möglichkeiten, auf einen Wörterbuchtyp (Dict) in Python zu verweisen

Es gibt zwei Möglichkeiten, den Wert eines Objekts vom Typ Wörterbuch in Python nachzuschlagen.

  1. Beziehen Sie sich wie es ist
  2. Verwenden Sie die get-Methode

~~ Es ist besser, das erstere nicht zu verwenden, aber ~~ * korrigiert. Zeige Kommentare * Es ist besser, das erstere nicht viel zu benutzen, aber ich werde den Grund erklären.

1. Wenn Sie sich so beziehen, wie es ist

Erstellen Sie eine einfache Klasse zur Veranschaulichung.

sample_class.py


class SampleDict1:

    def __init__(self, params: dict):
        self.name = params['name']
        self.age = params['age']
        self.sex = params['sex']

Dies ist eine Methode zum Übergeben der Informationen, die beim Erstellen einer Instanz als Argument vom Typ Wörterbuch erstellt werden sollen. Ich denke, dass Sie dies tun können, wenn Sie die erstellten Daten in JSON im Anforderungshauptteil der API speichern, sie auf der Serverseite in einen Wörterbuchtyp konvertieren und an die Modellebene übergeben.

Jetzt erstellen wir eine Instanz dieser Klasse.

from sample_class import SampleDict1

params = {'name':'test',
          'age':38,
          'sex':'male'}
sample_dict1 = SampleDict1(params)
print(sample_dict1.__dict__)
# {'name': 'test', 'age': 38, 'sex': 'male'}

Ich konnte es sicher erstellen. Wenn das beim Erstellen der Instanz übergebene Objekt vom Typ Wörterbuch keinen Mangel an Parametern aufweist, gibt es kein Problem. Schauen wir uns nun den Fall an, in dem das Wörterbuchobjekt kein Geschlecht enthält.

from sample_class import SampleDict1

params = {'name':'test',
          'age':38}
sample_dict1 = SampleDict1(params)
# KeyError: 'sex'

Wenn Sie direkt auf ein Objekt vom Typ Wörterbuch verweisen und der angegebene Schlüssel nicht im Objekt vorhanden ist, tritt eine Ausnahme namens KeyError auf. Wenn beispielsweise der Parameter sex nicht erforderlich ist, sollte die direkte Referenzmethode wie folgt implementiert werden.

sample_class.py


class SampleDict1:

    def __init__(self, params: dict):
        self.name = params['name']
        self.age = params['age']
        if 'sex' in params.keys():
            self.sex = params['sex']

Oder

sample_class.py


class SampleDict1:

    def __init__(self, params: dict):
        try:
            self.name = params['name']
            self.age = params['age']
            self.sex = params['sex']
        except KeyError:
            pass

… Der letztere Ansatz ist völlig lächerlich, kann aber in Quellen mit viel Code gefunden werden, der von ungelernten Leuten geschrieben wurde. Auf diese Weise kann die Methode zum direkten Verweisen auf ein Objekt vom Typ Wörterbuch eine unnötige Validierung und Ausnahmebehandlung erfordern.

2. Verwenden Sie die get-Methode

Was passiert also, wenn Sie die get-Methode verwenden, um den Wert eines Wörterbuchobjekts nachzuschlagen?

sample_class.py


class SampleDict2:

    def __init__(self, params):
        self.name = params.get('name')
        self.age = params.get('age')
        self.sex = params.get('sex')

Lassen Sie uns eine Instanz erstellen.

from sample_class import SampleDict2

params = {'name':'test',
          'age':38,
          'sex':'male'}
sample_dict2 = SampleDict2(params)
print(sample_dict2.__dict__)
# {'name': 'test', 'age': 38, 'sex': 'male'}

Wenn die Parameter keine Mängel aufweisen, wurden sie normalerweise wie im Fall von 1 erstellt. Was ist, wenn Sie nicht genügend Parameter haben?

from sample_class import SampleDict1

params = {'name':'test',
          'age':38}
sample_dict1 = SampleDict1(params)
print(sample_dict2.__dict__)
# {'name': 'test', 'age': 38, 'sex': None}

Auf diese Weise wurde None ohne KeyError gespeichert. In diesem Fall ist keine zusätzliche Verarbeitung erforderlich, z. B. wenn der Parameter sex nicht erforderlich ist. Darüber hinaus wird die Lesbarkeit nicht durch unnötige Validierung und Ausnahmebehandlung beeinträchtigt.

Selbst wenn Sie "Unbekannt" sagen möchten, wenn der Sex-Parameter keinen Wert hat, können Sie ihn klarer schreiben als bei 1. Wenn Sie direkt auf 1 verweisen möchten, implementieren Sie es zunächst wie folgt.

sample_class.py


class SampleDict1:

    def __init__(self, params: dict):
        self.name = params['name']
        self.age = params['age']
        if 'sex' in params.keys():
            self.sex = params['sex']
        else:
            self.sex = 'unknown'

Wenn andererseits die get-Methode von 2 verwendet wird, kann sie wie folgt implementiert werden.

sample_class.py


class SampleDict2:

    def __init__(self, params):
        self.name = params.get('name')
        self.age = params.get('age')
        self.sex = params.get('sex', 'unknown')
        # dict.get(key[, default])
        # Return the value for key if key is in the dictionary, else default.

Auf diese Weise ist es beim Festlegen des Standardwerts möglich, bei Verwendung der get-Methode 2 in eine Zeile zu schreiben, während bei Verwendung der direkten Referenzmethode 1 4 Zeilen verwendet werden.

abschließend

Wie wir oben gesehen haben, ist es bequemer, die get-Methode 2 als die direkte Referenzmethode 1 zu verwenden, wenn auf den Wert eines Objekts vom Typ Wörterbuch verwiesen wird. Wenn Sie also Code schreiben, auf den direkt verwiesen wird, ändern Sie bitte den gesamten Code, um die Methode sofort (dringend) abzurufen.

Ergänzung

In Bezug auf das letzte Beispiel können Sie auch im Fall von 1 wie folgt schreiben, wir empfehlen es jedoch nicht. Eine Zeile wird länger und es ist leicht, gegen die von PEP8 definierte Regel von weniger als 80 Zeilen zu verstoßen. Wenn Sie eine Zeile mit \ unterbrechen, um dies zu vermeiden, ist sie fürchterlich unlesbar und wartbar. Ich denke, es ist immer noch besser, es in vier Zeilen zu unterteilen, als dies zu tun.

sample_class.py


class SampleDict1:

    def __init__(self, params: dict):
        self.name = params['name']
        self.age = params['age']
        self.sex = params['sex'] if 'sex' in params.keys() else 'unknown'
            

Recommended Posts

Verwenden Sie get so viel wie möglich für Referenzen vom Typ Wörterbuch
Verwenden Sie BMFont als Schriftart für Pyglet
AtCoder: Python: Automatisieren Sie Beispieltests so weit wie möglich.
Verwenden Sie Flask als nächsten Schritt für SimpleHTTPServer
Verwenden Sie schwache Referenzen