Vielleicht möchten Sie aus einer Reihe von Gründen fast beliebige benannte Argumente akzeptieren - und das können Sie mit dem Formular **kw
machen.
Der häufigste Grund ist, die Argumente direkt an eine andere Funktion weiterzugeben, die Sie umhüllen (Dekoratoren sind ein Fall davon, aber FAR von der einzigen!) - in diesem Fall löst **kw
die Kopplung zwischen Wrapper und Wrapper, da der Wrapper die Argumente des Wrappers nicht kennen oder berücksichtigen muss. Hier ist ein weiterer, ganz anderer Grund:
d = dict(a=1, b=2, c=3, d=4)
wenn alle Namen im Voraus bekannt sein mußten, so ist offenbar dieser Ansatz konnte einfach nicht existiert, nicht wahr? Und btw, wenn anwendbar, ich viel lieber auf diese Weise eine dict machen, dessen Schlüssel Literalzeichenfolgen zu:
d = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
einfach, weil die letztere ganz Interpunktion lastig und damit weniger lesbar.
Wenn keiner der ausgezeichneten Gründe für die Annahme **kwargs
gilt, dann akzeptiere es nicht: es ist so einfach. IOW, wenn es keinen guten Grund gibt, dem Aufrufer zu erlauben, extra benannte Args mit beliebigen Namen zu übergeben, darf dies nicht passieren - vermeiden Sie einfach ein **kw
Formular am Ende der Signatur der Funktion in der def
Anweisung.
Was mit**kw
in einem Aufruf, die Sie, dass Sie die jeweils zusammen den genauen Satz von benannten Argumente können, mit entsprechenden Werten in einem dict passieren muss, unabhängig von einem Punkt einzigen Anruf, dann verwenden Sie diese dict an dem einzelnen Anrufpunkt. Vergleichen:
if x: kw['x'] = x
if y: kw['y'] = y
f(**kw)
zu:
if x:
if y:
f(x=x, y=y)
else:
f(x=x)
else:
if y:
f(y=y)
else:
f()
Selbst mit nur zwei Möglichkeiten (! Und der einfachsten Art), das Fehlen von **kw
aleady macht die zweite Option absolut unhaltbar und untragbar - nur stell dir vor, wie es ausgeht, wenn da ein halbes dutzend möglichkeiten, möglicherweise in etwas reicherer interaktion ... ohne **kw
wäre das leben unter solchen umständen absolute hölle!
Denken Sie an varargs in C - manchmal kann man nicht wissen, was Ihre Argumente sein. –
Bitte verwenden Sie nicht den Ausdruck "reale Welt" - es ist argumentativ. Es sagt: "Alle Beispiele, die ich bisher gesehen habe, sind erfunden und nutzlos; meine Anwendung ist die reale Welt, deine Beispiele sind eine Fantasiewelt." Bitte ändere deine Frage, um "reale Welt" zu eliminieren. –
Nur jemand, der streiten mag, würde denken, dass meine Frage argumentativ war. – meppum