Es gibt zwei Möglichkeiten, den Wert eines Objekts vom Typ Wörterbuch in Python nachzuschlagen.
~~ 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.
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.
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.
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.
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