Während die meisten Antworten sagen, dass z.
def f(**kwargs):
foo = kwargs.pop('foo')
bar = kwargs.pop('bar')
...etc...
ist das gleiche wie"
def f(foo=None, bar=None, **kwargs):
...etc...
das ist nicht wahr. Im letzteren Fall f
kann als aufgerufen werden f(23, 42)
, während im ersteren Fall nur benannte Argumente akzeptiert werden - keine Positionsaufrufe. Oft möchten Sie dem Anrufer maximale Flexibilität gewähren, und daher ist die zweite Form, wie die meisten Antworten behaupten, vorzuziehen. Dies ist jedoch nicht immer der Fall. Wenn Sie viele optionale Parameter akzeptieren, von denen normalerweise nur wenige übergeben werden, ist es möglicherweise eine hervorragende Idee (Vermeidung von Unfällen und unlesbarem Code an Ihren Anrufstellen!), Die Verwendung benannter Argumente zu erzwingen - threading.Thread
ist ein Beispiel. Das erste Formular ist, wie Sie das in Python 2 implementieren.
Das Idiom ist so wichtig, dass es in Python 3 jetzt eine spezielle unterstützende Syntax hat: Jedes Argument nach einem einzelnen *
in der def
Signatur ist nur ein Schlüsselwort, dh es kann nicht als Positionsargument übergeben werden, sondern nur als benanntes. In Python 3 können Sie Folgendes wie folgt codieren:
def f(*, foo=None, bar=None, **kwargs):
...etc...
In Python 3 können Sie sogar Argumente nur mit Schlüsselwörtern verwenden, die nicht optional sind (solche ohne Standardwert).
Python 2 hat jedoch noch lange Jahre produktiven Lebens vor sich. Vergessen Sie daher nicht die Techniken und Redewendungen, mit denen Sie wichtige Designideen in Python 2 implementieren können, die direkt in der Sprache in Python 3 unterstützt werden!