Wie überprüfe ich, ob ein Schlüssel in ** kwargs vorhanden ist?


110

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?


4
Es gibt keine besonderen Regeln. Sie haben gerade die Zitate vergessen.
Lennart Regebro

Antworten:


163

Sie wollen

if 'errormessage' in kwargs:
    print("found it")

Um den Wert von zu erhalten errormessage

if 'errormessage' in kwargs:
    print("errormessage equals " + kwargs.get("errormessage"))

Auf diese Weise kwargsist nur eine andere dict. Ihr erstes Beispiel if 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 einen KeyError.

Ihr zweites Beispiel if errormessage in kwargs:bedeutet "wenn kwargsdas durch" errormessage" benannte Element enthalten ist und wenn" errormessage"nicht der Name einer Variablen ist, erhalten Sie eine NameError.

Ich sollte erwähnen, dass Wörterbücher auch eine Methode haben, .get()die einen Standardparameter akzeptiert (standardmäßig selbst None), so dass kwargs.get("errormessage")der Wert zurückgegeben wird, wenn dieser Schlüssel vorhanden ist und Noneansonsten (ähnlich kwargs.get("errormessage", 17)wie Sie vielleicht denken). Wenn Sie sich nicht um den Unterschied zwischen dem vorhandenen Schlüssel und dem NoneWert als Wert oder dem nicht vorhandenen Schlüssel kümmern , kann dies hilfreich sein.


Danke für die zusätzliche Erklärung! Immer gut für Python-Neulinge, um Hintergrundinformationen und weitere Beispiele dafür zu erhalten, was möglich ist und was nicht. In diesem Sinne: Ich denke, kwargs.get("errormessage", 17)könnte seinen Wert zurückgeben oder 17wenn es keine Fehlermeldung gibt - aber ich bin mir nicht sicher. Ist das korrekt?
Honeybear

Ah ja, das tut es. Fand es hier . Danke ... wollte nur sicher sein.
Honeybear

21

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 einfachen print()Wrapper:

def my_print(*args, **kwargs):
    prefix = kwargs.pop('prefix', '')
    print(prefix, *args, **kwargs)

Dann:

>>> my_print('eggs')
 eggs
>>> my_print('eggs', prefix='spam')
spam eggs

Wie Sie sehen können, prefixwird kwargsder Standardwert ''(leere Zeichenfolge) in der lokalen prefixVariablen 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 **kwargsIhren Code langsamer machen und etwas mehr Eingabe benötigen, sich jedoch die Schnittstellen der aufgerufenen Funktion (in diesem Fall print) ändern, müssen Sie Ihren Code nicht ändern. Dieser Ansatz reduziert die Entwicklungszeit und unterstützt alle Schnittstellenänderungen.


Vielen Dank, dass Sie gezeigt haben, wie Sie einen Standardwert zuweisen prefix.
HBat

11

Es ist nur das:

if 'errormessage' in kwargs:
    print("yeah it's here")

Sie müssen überprüfen, ob sich der Schlüssel im Wörterbuch befindet. Die Syntax dafür ist some_key in some_dict(wo some_keyist 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 war globals(). Ihr Beispiel ist ähnlich, da Sie das Vorhandensein eines bestimmten Schlüssels im kwargsWörterbuch überprüfen (das Wörterbuch, das Schlüsselwortargumente enthält).


3

Eine Möglichkeit ist, es selbst hinzuzufügen! Wie? Durch Zusammenführen kwargsmit 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:

import sys

def myfunc(**kwargs):
    args = {'country':'England','town':'London',
            'currency':'Pound', 'language':'English'}

    diff = set(kwargs.keys()) - set(args.keys())
    if diff:
        print("Invalid args:",tuple(diff),file=sys.stderr)
        return

    args.update(kwargs)            
    print(args)

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 wir argsmit kwargsdenen keine neuen Werten überschrieben werden, dass der Benutzer festgelegt hat. Wir müssen nicht testen, ob ein Schlüssel vorhanden ist, sondern verwenden ihn jetzt argsals Argumentwörterbuch und benötigen ihn nicht mehr kwargs.


1

Sie können diese Dinge leicht selbst entdecken:

def hello(*args, **kwargs):
    print kwargs
    print type(kwargs)
    print dir(kwargs)

hello(what="world")

13
Entfernen Sie das "einfache" und dann ist es eine bessere Antwort. Wenn es für alle einfach wäre, würden wir diese Seite nicht brauchen. Es inist nicht einfach, den Operator an sich zu finden, wenn Sie noch nie programmiert haben und / oder Python noch nicht kennen. Es wird nur in der dict.get()und dict.setdefault()Hilfe angedeutet .
Siehe

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.