Skip to content

Argumente mit variabler Länge (*args, **kwargs) in Python

Python

In Python können Sie durch Hinzufügen von * und ** (ein oder zwei Sternchen) zum Kopf der Parameternamen in der Funktionsdefinition eine beliebige Anzahl von Argumenten (Argumente variabler Länge) angeben, wenn Sie die Funktion aufrufen.

Üblicherweise werden häufig die Namen *args (Argumente) und **kwargs (Schlüsselwortargumente) used, aber solange * und ** vorangestellt sind, gibt es keine Probleme mit anderen Namen. Der folgende Beispielcode used sterben Namen *args und **kwargs.

Dieser Artikel hat folgenden Inhalt.

  • *args: Mehrere Argumente als Tupel empfangen
  • **kwargs: Erhalten Sie mehrere Schlüsselwortargumente als Wörterbuch

Siehe den following Artikel für die Grundlagen von Funktionen in Python.

Wenn Sie beim Aufrufen einer Funktion * und ** hinzufügen, nicht beim Definieren einer Funktion, können Sie Listen und Wörterbücher entpacken und ein Argument übergeben.

*args: Mehrere Argumente als Tupel empfangen

Wenn SIE einen Parameter mit vorangestelltem * wie *args definieren, kann sterben Funktion beliebig viele Argumente erhalten.

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

In der Funktion werden mehrere Argumente als Tupel empfangen. Im Beispiel wird ein Tupel an die Funktion sum() ü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 mit Positionsargumenten verwendet werden.

Der nach (rechts) vom Positionsargument angegebene Wert wird als Tupel an args übergeben. If nur Positionsargumente übergeben Werden, ist args 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:  ()

Sie können *args zuerst definieren, aber in diesem Fall müssen nach *args definierte Parameter beim Funktionsaufruf im Schlüsselwortformat name=value angegeben werden.

Der letzte Wert wird nicht automatisch an das Positionsargument übergeben, und wenn er nicht als Schlüsselwortargument angegeben WIRD, WIRD TypeError ausgelöst.

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)

Mit dieser Eigenschaft gibt es eine Technik, um einen Parameter mit dem Namen * zu definieren und einen Parameter danach als reines Schlüsselwort-Argument zu verwenden.

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: Erhalten Sie mehrere Schlüsselwortargumente als Wörterbuch

Wenn SIE einen Parameter mit vorangestelltem ** wie **kwargs definieren, kann die Funktion viele beliebige Schlüsselwortargumente erhalten.

In der Funktion Werden mehrere Schlüsselwortargumente als Wörterbuch empfangen, dessen Schlüssel der Name des Arguments 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 mit Positionsargumenten 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}

Indem Sie beim Aufrufen einer Funktion ** zu einem Dictionary-Objekt hinzufügen, können Sie jedes Element an jedes Argument übergeben.

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

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

Im folgenden Artikel FINDEN SIE Notebooks zum Entpacken von Funktionsargumenten.

Ein Parameter mit ** kann nur am Ende der Parameterliste definiert werden. Wenn SIE nach dem Parameter mit ** weiteren einen Parameter definieren, wird WIRD SyntaxError ausgelöst.

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

# SyntaxError: invalid syntax