Angenommen, es connectionDetails
handelt sich um ein Python-Wörterbuch. Was ist die beste, eleganteste und "pythonischste" Methode, um Code wie diesen umzugestalten?
if "host" in connectionDetails:
host = connectionDetails["host"]
else:
host = someDefaultValue
python
dictionary
coding-style
mnowotka
quelle
quelle
if/else
viel schneller. Das könnte eine Rolle spielen oder auch nicht.if/else
schneller ist?Sie können auch Folgendes verwenden
defaultdict
:Sie können jede gewöhnliche Funktion anstelle von Lambda übergeben:
quelle
get
oder ähnlichen Methoden.Es
.get()
ist zwar eine nette Redewendung, aber langsamer alsif/else
(und langsamer alstry/except
wenn das Vorhandensein des Schlüssels im Wörterbuch die meiste Zeit erwartet werden kann):quelle
if/then
es schneller gehen würde. Beide Fälle erfordern eine Wörterbuch - Lookup, und es sei denn , der Aufrufget()
ist so viel langsamer, was sonst Konten für die Verlangsamung?O(1)
unabhängig von der Wörterbuchgröße, daher ist der Overhead des Funktionsaufrufs relevant.Versuchen Sie für mehrere verschiedene Standardeinstellungen Folgendes:
quelle
None
oder dem emptyString als einem der Werte in den Schlüssel-Wert-Paaren geliefert wird. Imdefaults
Wörterbuch kann möglicherweise einer seiner Werte unbeabsichtigt ausgeblendet werden. (siehe auch stackoverflow.com/questions/6354436 )In Python-Wörterbüchern gibt es eine Methode, um dies zu tun:
dict.setdefault
Diese Methode setzt jedoch den Wert auf
connectionDetails['host']
,someDefaultValue
wenn der Schlüsselhost
nicht bereits definiert ist, anders als in der gestellten Frage.quelle
setdefault()
der Wert zurückgegeben wird, sodass dies auch funktioniert :host = connectionDetails.setdefault('host', someDefaultValue)
. Beachten Sie nur, dassconnectionDetails['host']
der Standardwert festgelegt wird, wenn der Schlüssel zuvor nicht vorhanden war.(Dies ist eine späte Antwort)
Eine Alternative besteht darin, die
dict
Klasse in Unterklassen zu unterteilen und die__missing__()
Methode wie folgt zu implementieren :Beispiele:
quelle
Wenn ich @Tim Pietzckers Verdacht auf die Situation in PyPy (5.2.0-alpha0) für Python 3.3.5 teste, stelle ich fest, dass tatsächlich beide
.get()
und dieif
/else
way eine ähnliche Leistung erbringen . Tatsächlich scheint es im if / else-Fall nur eine einzige Suche zu geben, wenn die Bedingung und die Zuweisung denselben Schlüssel beinhalten (vergleiche mit dem letzten Fall, in dem es zwei Suchen gibt).quelle
Sie können hierfür eine Lamba-Funktion als Einzeiler verwenden. Erstellen Sie ein neues Objekt, auf
connectionDetails2
das wie eine Funktion zugegriffen wird ...Jetzt benutzen
anstatt
Dies gibt den Wörterbuchwert zurück, wenn er
k
in den Schlüsseln enthalten ist, andernfalls wird er zurückgegeben"DEFAULT"
quelle