python dict get - * Argumente und ** Kwargs?





5 Answers

Ein Ort, wo die Verwendung von *args und **kwargs sehr nützlich ist, ist für Unterklassen.

class Foo(object):
    def __init__(self, value1, value2):
        # do something with the values
        print value1, value2

class MyFoo(Foo):
    def __init__(self, *args, **kwargs):
        # do something else, don't care about the args
        print 'myfoo'
        super(MyFoo, self).__init__(*args, **kwargs)

Auf diese Weise können Sie das Verhalten der Foo-Klasse erweitern, ohne zu viel über Foo wissen zu müssen. Dies kann sehr praktisch sein, wenn Sie eine API programmieren, die sich ändern könnte. MyFoo übergibt einfach alle Argumente an die Foo-Klasse.

work with count

Diese Frage hat hier bereits eine Antwort:

Also habe ich Schwierigkeiten mit dem Konzept von *args und **kwargs .

Bisher habe ich gelernt, dass:

  • *args = Liste der Argumente - als Positionsargumente
  • **kwargs = Dictionary - deren Schlüssel werden zu separaten Schlüsselwortargumenten und die Werte werden zu Werten dieser Argumente.

Ich verstehe nicht, für welche Programmieraufgabe das hilfreich wäre.

Könnte sein:

Ich denke, Listen und Wörterbücher als Argumente einer Funktion und gleichzeitig als Platzhalter einzugeben, damit ich jedes Argument bestehen kann?

Gibt es ein einfaches Beispiel, um zu erklären, wie *args und **kwargs verwendet werden?

Auch das Tutorial fand ich nur mit dem "*" und einem Variablennamen.

Sind *args und **kwargs nur Platzhalter oder verwendest du genau *args und **kwargs im Code?




Hier ist einer meiner Lieblingsorte, um die ** Syntax wie im letzten Beispiel von Dave Webb zu verwenden:

mynum = 1000
mystr = 'Hello World!'
print "{mystr} New-style formatting is {mynum}x more fun!".format(**locals())

Ich bin mir nicht sicher, ob es im Vergleich zu den Namen selbst schrecklich schnell ist, aber es ist viel einfacher zu tippen!




* args und ** kwargs sind spezielle magische Eigenschaften von Python. Stellen Sie sich eine Funktion vor, die eine unbekannte Anzahl von Argumenten haben könnte. Zum Beispiel möchten Sie, aus welchen Gründen auch immer, eine Funktion haben, die eine unbekannte Anzahl von Zahlen summiert (und Sie möchten nicht die eingebaute Summenfunktion verwenden). Also schreibst du diese Funktion:

def sumFunction(*args):
  result = 0
  for x in args:
    result += x
  return result

und benutze es wie: sumFunction (3,4,6,3,6,8,9).

** Kwargs hat eine unterschiedliche Funktion. Mit ** kwargs können Sie einer Funktion beliebige Schlüsselwortargumente geben und Sie können sie als Diktat verwenden.

def someFunction(**kwargs):
  if 'text' in kwargs:
    print kwargs['text']

Durch den Aufruf von someFunction (text = "foo") wird foo gedruckt.




Die Namen *args und **kwargs oder **kw sind rein per Konvention. Es erleichtert es uns, den Code des jeweils anderen zu lesen

Ein Ort ist es praktisch, wenn Sie das Strukturmodul verwenden

struct.unpack() gibt ein Tupel zurück, während struct.pack() eine variable Anzahl von Argumenten verwendet. Wenn Daten manipuliert werden, ist es praktisch, ein Tupel an struck.pack() .

tuple_of_data = struct.unpack(format_str, data)
... manipulate the data
new_data = struct.pack(format_str, *tuple_of_data)

Ohne diese Fähigkeit wären Sie gezwungen zu schreiben

new_data = struct.pack(format_str, tuple_of_data[0], tuple_of_data[1], tuple_of_data[2],...)

Das bedeutet auch, wenn sich format_str ändert und sich die Größe des Tupels ändert, muss ich zurückgehen und diese wirklich lange Zeile bearbeiten




Diese Parameter werden normalerweise für Proxy-Funktionen verwendet, sodass der Proxy beliebige Eingabeparameter an die Zielfunktion übergeben kann.

def foo(bar=2, baz=5):
    print bar, baz

def proxy(x, *args, **kwargs): # reqire parameter x and accept any number of additional arguments
    print x
    foo(*args, **kwargs) # applies the "non-x" parameter to foo

proxy(23, 5, baz='foo') # calls foo with bar=5 and baz=foo
proxy(6)# calls foo with its default arguments
proxy(7, bar='asdas') # calls foo with bar='asdas' and leave baz default argument

Da diese Parameter jedoch die eigentlichen Parameternamen verbergen, ist es besser, sie zu vermeiden.




Related