2012-09-13 15 views
55

Python 3.2.3. Es gab einige Ideen listed here, die auf regulären Var funktionieren, aber es scheint ** Kwargs spielen nach verschiedenen Regeln ... also warum funktioniert das nicht und wie kann ich überprüfen, ob ein Schlüssel in ** kwargs existiert?Wie überprüft man, ob ein Schlüssel in ** kwargs vorhanden ist?

if kwargs['errormessage']: 
    print("It exists") 

Ich denke auch, sollte dies funktionieren, aber es funktioniert nicht -

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

Ich vermute, weil kwargs iterable ist? Muss ich es durchlaufen, nur um zu prüfen, ob ein bestimmter Schlüssel da ist?

+2

Es gibt keine speziellen Regeln. Du hast die Zitate einfach vergessen. –

Antwort

86

Sie wollen

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

Um den Wert von errormessage

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

Auf diese Weise zu erhalten, kwargs ist nur ein weiterer dict. Ihr erstes Beispiel, if kwargs['errormessage'], bedeutet "holen Sie sich den Wert, der dem Schlüssel" errormessage "in kwargs zugeordnet ist, und überprüfen Sie dann seinen bool-Wert". Wenn es keinen solchen Schlüssel gibt, erhalten Sie eine KeyError.

Ihr zweites Beispiel if errormessage in kwargs: bedeutet errormessage „wenn kwargs das Element von dem Namen enthält““, und es sei denn,‚errormessage‘ist der Name einer Variablen, werden Sie ein NameError erhalten.

sollte ich erwähnen, dass Wörterbücher haben auch eine Methode .get(), die einen Standardparameter akzeptiert (selbst standardmäßig None), so dass kwargs.get("errormessage") den Wert zurückgibt, wenn dieser Schlüssel existiert und None sonst (ähnlich tut, was Sie vielleicht denken, dass es tut). Wenn Sie nicht kümmern der Unterschied zwischen dem Schlüssel vorhanden und None als Wert oder der Schlüssel nicht e Das kann nützlich sein.

8

Es ist nur dies:

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

Sie müssen prüfen, ob der Schlüssel im Wörterbuch enthalten ist. Die Syntax dafür ist some_key in some_dict (wobei some_key etwas ist, das hashable ist, nicht notwendigerweise eine Zeichenkette).

Die von Ihnen verknüpften Ideen (these ideas) enthielten Beispiele für die Überprüfung, ob ein bestimmter Schlüssel in Wörterbüchern existiert, die von locals() und globals() zurückgegeben wurden. Ihr Beispiel ist ähnlich, weil Sie das Vorhandensein eines bestimmten Schlüssels im kwargs Wörterbuch (dem Wörterbuch, das Schlüsselwortargumente enthält) prüfen.

1

Sie können diese Dinge leicht selbst zu entdecken:

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

hello(what="world") 
+3

Entfernen Sie die "einfache" und dann ist es eine bessere Antwort. Wenn es für alle einfach wäre, würden wir diese Seite nicht brauchen. Den "in" -Operator an sich zu finden ist nicht einfach, wenn Sie Python nie programmiert und/oder neu sind. Es wird nur in der Hilfe 'dict.get() 'und' dict.setdefault() 'angedeutet. – cfi

2

Eine Möglichkeit, es selbst zu addieren ist! Wie? Durch das Zusammenführen von kwargs mit einer Reihe von Standardeinstellungen. Dies ist nicht immer der Fall, zum Beispiel wenn die Schlüssel nicht im Voraus bekannt sind. Allerdings, wenn sie sind, hier ist 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 Standardwerte eingestellt sind, im Wörterbuch args, die alle Schlüssel enthält wir erwarten. Wir prüfen zuerst, ob es unerwartete Schlüssel in Kwargs gibt.Dann aktualisieren wir args mit kwargs, die alle neuen Werte überschreibt, die der Benutzer eingestellt hat. Wir müssen nicht testen, ob ein Schlüssel existiert, wir verwenden jetzt args als unser Argumentwörterbuch und brauchen kwargs nicht mehr.

11

Antworten von DSM und Tadeck beantworten Ihre Frage direkt.

In meinen Skripten verwende ich oft die 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, wenn prefix nicht in kwargs enthalten ist, dann ist der Standard '' (leere Zeichenkette) gespeichert wird in die lokale prefix Variable. Wenn es angegeben wird, wird der Wert verwendet.

Dies ist in der Regel eine kompakte und lesbare Rezept für Wrapper für jede Art von Funktion: Immer nur Pass-Through-Argumente, die Sie nicht verstehen, und wissen nicht einmal, ob sie existieren. Wenn Sie immer *args und **kwargs durchlaufen, machen Sie Ihren Code langsamer und erfordern ein wenig mehr Eingabe, aber wenn sich die Schnittstellen der aufgerufenen Funktion (in diesem Fall print) ändern, müssen Sie Ihren Code nicht ändern. Dieser Ansatz verkürzt die Entwicklungszeit und unterstützt alle Schnittstellenänderungen.