Wie man Argumente variabler Länge (*args, **kwargs) in Python verwendet

Geschäft

Die folgenden Funktionsargumente sind wahrscheinlich die häufigsten, die Sie stutzig machen, wenn Sie sich Python-Code ansehen und fragen: “Was ist das?

  • *args
  • **kwargs

Eine beliebige Anzahl von Argumenten (Argumente variabler Länge) kann durch Anhängen eines Sternchens an das Argument in der Funktionsdefinition wie folgt angegeben werden

  • *
  • **

Die Namen *args,**kwargs werden häufig als Konvention verwendet. Es sind jedoch auch andere Namen zulässig, solange * und ** am Anfang stehen. Der folgende Beispielcode verwendet die Namen *args,**kwargs.

Im Folgenden werden die Einzelheiten beschrieben.

  • *args:Akzeptiert mehrere Argumente als Tupel
  • **kwargs:Akzeptiert mehrere Schlüsselwortargumente als Wörterbuch

*args: Akzeptiert mehrere Argumente als Tupel

Eine beliebige Anzahl von Argumenten kann angegeben werden, indem Argumente mit * definiert werden, wie in *args.

def my_sum(*args):
    return sum(args)

print(my_sum(1, 2, 3, 4))
# 10

print(my_sum(1, 2, 3, 4, 5, 6, 7, 8))
# 36

Mehrere Argumente werden als Tupel in der Funktion empfangen. In diesem Beispiel wird der Funktion sum() ein Tupel übergeben, um die Summe zu berechnen.

def my_sum2(*args):
    print('args: ', args)
    print('type: ', type(args))
    print('sum : ', sum(args))

my_sum2(1, 2, 3, 4)
# args:  (1, 2, 3, 4)
# type:  <class 'tuple'>
# sum :  10

Es kann auch mit einem Positionsargument kombiniert werden.

Der nach dem Positionsargument (rechts davon) angegebene Wert wird als Tupel an args übergeben. Wenn es nur ein Positionsargument gibt, ist es ein leeres Tupel.

def func_args(arg1, arg2, *args):
    print('arg1: ', arg1)
    print('arg2: ', arg2)
    print('args: ', args)

func_args(0, 1, 2, 3, 4)
# arg1:  0
# arg2:  1
# args:  (2, 3, 4)

func_args(0, 1)
# arg1:  0
# arg2:  1
# args:  ()

Mit * gekennzeichnete Argumente können zuerst definiert werden. In diesem Fall müssen jedoch Argumente, die später als *args definiert werden, in Schlüsselwortform angegeben werden. Das Schlüsselwortformat ist übrigens die Form “Argumentname = Wert”.

Der letzte Wert wird nicht automatisch an das Positionsargument übergeben. Wenn er also nicht als Schlüsselwortargument angegeben wird, führt dies zu einem TypeError-Fehler.

def func_args2(arg1, *args, arg2):
    print('arg1: ', arg1)
    print('arg2: ', arg2)
    print('args: ', args)

# func_args2(0, 1, 2, 3, 4)
# TypeError: func_args2() missing 1 required keyword-only argument: 'arg2'

func_args2(0, 1, 2, 3, arg2=4)
# arg1:  0
# arg2:  4
# args:  (1, 2, 3)

Wenn nur * Argumente angegeben werden, müssen die nachfolgenden Argumente immer als Schlüsselwortargumente angegeben werden.(keyword-only argument)

def func_args_kw_only(arg1, *, arg2):
    print('arg1: ', arg1)
    print('arg2: ', arg2)

# func_args_kw_only(100, 200)
# TypeError: func_args_kw_only() takes 1 positional argument but 2 were given

func_args_kw_only(100, arg2=200)
# arg1:  100
# arg2:  200

**kwargs: Akzeptiert mehrere Schlüsselwortargumente als Wörterbuch

Eine beliebige Anzahl von Schlüsselwortargumenten kann angegeben werden, indem Argumente mit ,** wie in **kwargs definiert werden.

In der Funktion wird der Name des Arguments als ein Wörterbuch empfangen, dessen Schlüssel der Schlüssel und dessen Wert der Wert ist.

def func_kwargs(**kwargs):
    print('kwargs: ', kwargs)
    print('type: ', type(kwargs))

func_kwargs(key1=1, key2=2, key3=3)
# kwargs:  {'key1': 1, 'key2': 2, 'key3': 3}
# type:  <class 'dict'>

Es kann auch in Verbindung mit einem Positionsargument verwendet werden.

def func_kwargs_positional(arg1, arg2, **kwargs):
    print('arg1: ', arg1)
    print('arg2: ', arg2)
    print('kwargs: ', kwargs)

func_kwargs_positional(0, 1, key1=1)
# arg1:  0
# arg2:  1
# kwargs:  {'key1': 1}

Durch Angabe des Wörterbuchobjekts mit ** als Argument beim Funktionsaufruf ist es möglich, es zu erweitern und als entsprechendes Argument zu übergeben.

d = {'key1': 1, 'key2': 2, 'arg1': 100, 'arg2': 200}

func_kwargs_positional(**d)
# arg1:  100
# arg2:  200
# kwargs:  {'key1': 1, 'key2': 2}

Mit ** gekennzeichnete Argumente dürfen nur am Ende des Arguments definiert werden. Die Definition eines weiteren Arguments nach dem mit ** gekennzeichneten Argument führt zu einem SyntaxError-Fehler.

# def func_kwargs_error(**kwargs, arg):
#     print(kwargs)

# SyntaxError: invalid syntax