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.

19voto

orokusaki Punkte 51153

Hier ist ein anderer Ansatz:

def my_func(arg1, arg2, arg3):
    ... so something ...

kwargs = {'arg1': 'Value One', 'arg2': 'Value Two', 'arg3': 'Value Three'}
# Now you can call the function with kwargs like this:

my_func(**kwargs)

19voto

user1930143 Punkte 161

Ich denke, die richtige Art und Weise der Verwendung **kwargs in Python, wenn es um Standardwerte geht, ist die Verwendung der Wörterbuchmethode setdefault wie unten angegeben:

class ExampleClass:
    def __init__(self, **kwargs):
        kwargs.setdefault('val', value1)
        kwargs.setdefault('val2', value2)

Auf diese Weise kann ein Benutzer, der 'val' oder 'val2' im Schlüsselwort args werden sie verwendet; andernfalls werden die eingestellten Standardwerte verwendet.

16voto

rebelliard Punkte 9472

Nachbereitung von @srhegde Vorschlag zur Verwendung setattr :

class ExampleClass(object):
    __acceptable_keys_list = ['foo', 'bar']

    def __init__(self, **kwargs):
        [self.__setattr__(key, kwargs.get(key)) for key in self.__acceptable_keys_list]

Diese Variante ist nützlich, wenn von der Klasse erwartet wird, dass sie alle Elemente in unserer acceptable Liste.

14voto

Steef Punkte 30321

Sie könnten etwa so vorgehen

class ExampleClass:
    def __init__(self, **kwargs):
        arguments = {'val':1, 'val2':2}
        arguments.update(kwargs)
        self.val = arguments['val']
        self.val2 = arguments['val2']

7voto

Jens Timmerman Punkte 8367

Wenn Sie dies mit *args kombinieren wollen, müssen Sie *args und **kwargs am Ende der Definition behalten.

Also:

def method(foo, bar=None, *args, **kwargs):
    do_something_with(foo, bar)
    some_other_function(*args, **kwargs)

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