Python 3.2.3. Es wurden hier einige Ideen aufgelistet , die auf regulären Vars funktionieren, aber es scheint, dass ** kwargs nach unterschiedlichen Regeln spielen ... warum funktioniert das nicht und wie kann ich überprüfen, ob ein Schlüssel in ** kwargs vorhanden ist?
if kwargs['errormessage']:
print("It exists")
Ich denke auch, dass dies funktionieren sollte, aber es funktioniert nicht -
if errormessage in kwargs:
print("yeah it's here")
Ich vermute, weil kwargs iterierbar ist? Muss ich es durchlaufen, um zu überprüfen, ob ein bestimmter Schlüssel vorhanden ist?
python
dictionary
python-3.x
kwargs
Zamphatta
quelle
quelle
Antworten:
Sie wollen
Um den Wert von zu erhalten
errormessage
Auf diese Weise
kwargs
ist nur eine anderedict
. Ihr erstes Beispielif kwargs['errormessage']
bedeutet "Holen Sie sich den Wert, der dem Schlüssel" Fehlermeldung "in kwargs zugeordnet ist, und überprüfen Sie dann seinen Bool-Wert". Wenn es also keinen solchen Schlüssel gibt, erhalten Sie einenKeyError
.Ihr zweites Beispiel
if errormessage in kwargs:
bedeutet "wennkwargs
das durch"errormessage
" benannte Element enthalten ist und wenn"errormessage
"nicht der Name einer Variablen ist, erhalten Sie eineNameError
.Ich sollte erwähnen, dass Wörterbücher auch eine Methode haben,
.get()
die einen Standardparameter akzeptiert (standardmäßig selbstNone
), so dasskwargs.get("errormessage")
der Wert zurückgegeben wird, wenn dieser Schlüssel vorhanden ist undNone
ansonsten (ähnlichkwargs.get("errormessage", 17)
wie Sie vielleicht denken). Wenn Sie sich nicht um den Unterschied zwischen dem vorhandenen Schlüssel und demNone
Wert als Wert oder dem nicht vorhandenen Schlüssel kümmern , kann dies hilfreich sein.quelle
kwargs.get("errormessage", 17)
könnte seinen Wert zurückgeben oder17
wenn es keine Fehlermeldung gibt - aber ich bin mir nicht sicher. Ist das korrekt?Die Antworten von DSM und Tadeck beantworten Ihre Frage direkt.
In meinen Skripten verwende ich häufig das Bequeme
dict.pop()
, um mit optionalen und zusätzlichen Argumenten umzugehen. Hier ist ein Beispiel für einen einfachenprint()
Wrapper:Dann:
Wie Sie sehen können,
prefix
wirdkwargs
der Standardwert''
(leere Zeichenfolge) in der lokalenprefix
Variablen gespeichert , wenn er nicht in enthalten ist . Wenn es gegeben ist, wird sein Wert verwendet.Dies ist im Allgemeinen ein kompaktes und lesbares Rezept zum Schreiben von Wrappern für jede Art von Funktion: Führen Sie immer nur Argumente durch, die Sie nicht verstehen und nicht einmal wissen, ob sie existieren. Wenn Sie immer durch
*args
und**kwargs
Ihren Code langsamer machen und etwas mehr Eingabe benötigen, sich jedoch die Schnittstellen der aufgerufenen Funktion (in diesem Fallprint
) ändern, müssen Sie Ihren Code nicht ändern. Dieser Ansatz reduziert die Entwicklungszeit und unterstützt alle Schnittstellenänderungen.quelle
prefix
.Es ist nur das:
Sie müssen überprüfen, ob sich der Schlüssel im Wörterbuch befindet. Die Syntax dafür ist
some_key in some_dict
(wosome_key
ist etwas Hashbares, nicht unbedingt eine Zeichenfolge).Die von Ihnen verknüpften Ideen ( diese Ideen ) enthielten Beispiele für die Überprüfung, ob in von
locals()
und zurückgegebenen Wörterbüchern ein bestimmter Schlüssel vorhanden warglobals()
. Ihr Beispiel ist ähnlich, da Sie das Vorhandensein eines bestimmten Schlüssels imkwargs
Wörterbuch überprüfen (das Wörterbuch, das Schlüsselwortargumente enthält).quelle
Eine Möglichkeit ist, es selbst hinzuzufügen! Wie? Durch Zusammenführen
kwargs
mit einer Reihe von Standardeinstellungen. Dies ist beispielsweise nicht in allen Fällen angemessen, wenn Ihnen die Schlüssel nicht im Voraus bekannt sind. Wenn dies jedoch der Fall ist, ist hier ein einfaches Beispiel:Die Standardeinstellungen werden im Wörterbuch festgelegt
args
, das alle erwarteten Schlüssel enthält. Wir prüfen zunächst, ob in kwargs unerwartete Schlüssel vorhanden sind. Dann aktualisieren wirargs
mitkwargs
denen keine neuen Werten überschrieben werden, dass der Benutzer festgelegt hat. Wir müssen nicht testen, ob ein Schlüssel vorhanden ist, sondern verwenden ihn jetztargs
als Argumentwörterbuch und benötigen ihn nicht mehrkwargs
.quelle
Sie können diese Dinge leicht selbst entdecken:
quelle
in
ist nicht einfach, den Operator an sich zu finden, wenn Sie noch nie programmiert haben und / oder Python noch nicht kennen. Es wird nur in derdict.get()
unddict.setdefault()
Hilfe angedeutet .quelle