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.

3voto

tmsss Punkte 1414

Eine weitere einfache Lösung für die Verarbeitung unbekannter oder mehrerer Argumente kann sein:

class ExampleClass(object):

    def __init__(self, x, y, **kwargs):
      self.x = x
      self.y = y
      self.attributes = kwargs

    def SomeFunction(self):
      if 'something' in self.attributes:
        dosomething()

2voto

user3503692 Punkte 189

**kwargs bietet die Möglichkeit, eine beliebige Anzahl von Schlüsselwortargumenten hinzuzufügen. Man kann eine Liste von Schlüsseln haben, für die man Standardwerte festlegen kann. Das Festlegen von Standardwerten für eine unbestimmte Anzahl von Schlüsseln erscheint jedoch unnötig. Schließlich kann es wichtig sein, die Schlüssel als Instanzattribute zu haben. Ich würde dies also wie folgt tun:

class Person(object):
listed_keys = ['name', 'age']

def __init__(self, **kwargs):
    _dict = {}
    # Set default values for listed keys
    for item in self.listed_keys: 
        _dict[item] = 'default'
    # Update the dictionary with all kwargs
    _dict.update(kwargs)

    # Have the keys of kwargs as instance attributes
    self.__dict__.update(_dict)

1voto

user20160 Punkte 1386

@AbhinavGupta und @Steef schlugen die Verwendung von update() die ich für die Bearbeitung großer Argumentlisten sehr hilfreich fand:

args.update(kwargs)

Was, wenn wir überprüfen wollen, dass der Benutzer keine falschen/ununterstützten Argumente übergeben hat? @VinaySajip wies darauf hin, dass pop() kann verwendet werden, um die Liste der Argumente iterativ zu bearbeiten. Dann sind alle übrig gebliebenen Argumente Scheinargumente. Schön.

Hier ist eine weitere Möglichkeit, dies zu tun, die die einfache Syntax der Verwendung von update() :

# kwargs = dictionary of user-supplied arguments
# args = dictionary containing default arguments

# Check that user hasn't given spurious arguments
unknown_args = user_args.keys() - default_args.keys()
if unknown_args:
    raise TypeError('Unknown arguments: {}'.format(unknown_args))

# Update args to contain user-supplied arguments
args.update(kwargs)

unknown_args ist eine set mit den Namen der Argumente, die nicht in den Standardeinstellungen vorkommen.

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