Hvordan man bruger argumenter med variabel længde (*args, **kwargs) i Python

Forretning

Følgende funktionsargumenter er sandsynligvis de mest almindelige, som du bliver overrasket over, når du kigger på Python-kode og spørger: “Hvad er det her?

  • *args
  • **kwargs

Der kan angives et vilkårligt antal argumenter (argumenter med variabel længde) ved at tilføje en asterisk til argumentet i funktionsdefinitionen på følgende måde

  • *
  • **

Navnene *args,**kwargs bruges ofte som en konvention. Andre navne er dog acceptable, så længe * og ** står i begyndelsen. I følgende kodeeksempel anvendes navnene *args,**kwargs.

Følgende oplysninger er beskrevet nedenfor.

  • *args:Accepterer flere argumenter som en tupel
  • **kwargs:Accepterer flere nøgleordsargumenter som en ordbog

*args: Accepterer flere argumenter som en tupel

Der kan angives et vilkårligt antal argumenter ved at definere argumenter med *, som i *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

Flere argumenter modtages som en tupel i funktionen. I eksemplet får funktionen sum() en tupel til at beregne summen.

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

Det kan også kombineres med et positionsargument.

Den værdi, der er angivet efter (til højre for) det positionelle argument, overføres til args som en tupel. Hvis der kun er et positionelt argument, er det en tom 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:  ()

Argumenter markeret med * kan defineres først. I dette tilfælde skal argumenter, der defineres senere end *args, dog angives i nøgleordsform. I øvrigt er nøgleordsformatet “argumentnavn = værdi”-formen.

Den sidste værdi overføres ikke automatisk til det positionelle argument. Hvis den ikke er angivet som et nøgleordsargument, vil der derfor opstå en TypeError-fejl.

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)

Hvis der kun angives * argumenter, skal efterfølgende argumenter altid angives som nøgleordsargumenter.(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: Accepterer flere nøgleordsargumenter som en ordbog

Der kan angives et vilkårligt antal nøgleordsargumenter ved at definere argumenter med ,** som i **kwargs.

I funktionen modtages navnet på argumentet som en ordbog, hvis nøgle er nøglen, og hvis værdi er værdien.

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'>

Det kan også bruges sammen med et positionsargument.

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}

Ved at angive ordbogsobjektet med ** som et argument, når du kalder funktionen, er det muligt at udvide det og overføre det som det respektive argument.

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

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

Argumenter markeret med ** kan kun defineres i slutningen af argumentet. Hvis der defineres et andet argument efter det argument, der er markeret med **, vil det resultere i en SyntaxError-fejl.

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

# SyntaxError: invalid syntax
Copied title and URL