612 Stimmen

Richtige Verwendung von **kwargs in Python

Was ist die richtige Art der Verwendung **kwargs in Python, wenn es um Standardwerte geht?

kwargs gibt ein Wörterbuch zurück, aber was ist der beste Weg, um Standardwerte festzulegen, oder gibt es einen? Sollte ich einfach als Wörterbuch darauf zugreifen? Die Funktion get verwenden?

class ExampleClass:
    def __init__(self, **kwargs):
        self.val = kwargs['val']
        self.val2 = kwargs.get('val2')

Eine einfache Frage, zu der ich aber keine guten Quellen finden kann. Die Leute machen es auf unterschiedliche Weise im Code, die ich gesehen habe, und es ist schwer zu wissen, was zu verwenden.

645voto

balpha Punkte 47970

Sie können einen Standardwert an get() für Schlüssel, die nicht im Wörterbuch enthalten sind:

self.val2 = kwargs.get('val2',"default value")

Wenn Sie jedoch vorhaben, ein bestimmtes Argument mit einem bestimmten Standardwert zu verwenden, warum sollten Sie dann nicht von vornherein benannte Argumente verwenden?

def __init__(self, val2="default value", **kwargs):

107voto

Abhinav Gupta Punkte 4450

Ich schlage etwas vor wie dieses

def testFunc( **kwargs ):
    options = {
            'option1' : 'default_value1',
            'option2' : 'default_value2',
            'option3' : 'default_value3', }

    options.update(kwargs)
    print options

testFunc( option1='new_value1', option3='new_value3' )
# {'option2': 'default_value2', 'option3': 'new_value3', 'option1': 'new_value1'}

testFunc( option2='new_value2' )
# {'option1': 'default_value1', 'option3': 'default_value3', 'option2': 'new_value2'}

Und dann verwenden Sie die Werte nach Belieben

dictionaryA.update(dictionaryB) fügt den Inhalt von dictionaryB a dictionaryA Überschreiben aller doppelten Schlüssel.

65voto

Vinay Sajip Punkte 89444

Sie würden

self.attribute = kwargs.pop('name', default_value)

ou

self.attribute = kwargs.get('name', default_value)

Wenn Sie pop können Sie überprüfen, ob falsche Werte gesendet wurden, und gegebenenfalls die entsprechenden Maßnahmen ergreifen.

55voto

S.Lott Punkte 371691

Die Verwendung von **kwargs und Standardwerten ist einfach. Manchmal sollten Sie jedoch **kwargs gar nicht erst verwenden.

In diesem Fall machen wir nicht wirklich den besten Gebrauch von **kwargs.

class ExampleClass( object ):
    def __init__(self, **kwargs):
        self.val = kwargs.get('val',"default1")
        self.val2 = kwargs.get('val2',"default2")

Die obige Aussage ist eine "Warum sich die Mühe machen?"-Erklärung. Sie ist dasselbe wie

class ExampleClass( object ):
    def __init__(self, val="default1", val2="default2"):
        self.val = val
        self.val2 = val2

Wenn Sie **kwargs verwenden, bedeutet das, dass ein Schlüsselwort nicht nur optional, sondern bedingt ist. Es gibt komplexere Regeln als einfache Standardwerte.

Wenn Sie **kwargs verwenden, meinen Sie in der Regel etwas wie das Folgende, wobei einfache Standardwerte nicht gelten.

class ExampleClass( object ):
    def __init__(self, **kwargs):
        self.val = "default1"
        self.val2 = "default2"
        if "val" in kwargs:
            self.val = kwargs["val"]
            self.val2 = 2*self.val
        elif "val2" in kwargs:
            self.val2 = kwargs["val2"]
            self.val = self.val2 / 2
        else:
            raise TypeError( "must provide val= or val2= parameter values" )

51voto

srhegde Punkte 503

Seit **kwargs verwendet wird, wenn die Anzahl der Argumente nicht bekannt ist, warum also nicht so?

class Exampleclass(object):
  def __init__(self, **kwargs):
    for k in kwargs.keys():
       if k in [acceptable_keys_list]:
          self.__setattr__(k, kwargs[k])

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X