Cara menggunakan argumen panjang berubah-ubah (*args, **kwargs) dalam Python

Perniagaan

Argumen fungsi berikut mungkin adalah yang paling biasa yang mengganggu anda apabila anda melihat kod Python dan berkata, “Apakah ini?

  • *args
  • **kwargs

Sebarang bilangan argumen (argumen panjang-pembolehubah) boleh ditentukan dengan menambahkan asterisk pada hujah dalam definisi fungsi seperti berikut

  • *
  • **

Nama *args,**kwargs sering digunakan sebagai konvensyen. Walau bagaimanapun, nama lain boleh diterima selagi * dan ** berada di permulaan. Kod sampel berikut menggunakan nama *args,**kwargs.

Butiran berikut diterangkan di bawah.

  • *args:Menerima berbilang hujah sebagai tupel
  • **kwargs:Menerima berbilang hujah kata kunci sebagai kamus

*args:Menerima berbilang hujah sebagai tupel

Bilangan arbitrari argumen boleh ditentukan dengan mentakrifkan argumen dengan *, seperti dalam *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

Berbilang argumen diterima sebagai tupel dalam fungsi. Dalam contoh, fungsi sum() diluluskan tuple untuk mengira jumlah.

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

Ia juga boleh digabungkan dengan hujah kedudukan.

Nilai yang ditentukan selepas (di sebelah kanan) argumen kedudukan diserahkan kepada args sebagai tupel. Jika hanya ada hujah kedudukan, ia adalah tuple kosong.

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:  ()

Hujah yang bertanda * boleh ditakrifkan dahulu. Walau bagaimanapun, dalam kes ini, hujah yang ditakrifkan lewat daripada *args mesti dinyatakan dalam bentuk kata kunci. Secara kebetulan, format kata kunci ialah bentuk “nama argumen = nilai”.

Nilai terakhir tidak dihantar secara automatik ke argumen kedudukan. Oleh itu, jika ia tidak dinyatakan sebagai hujah kata kunci, ralat TypeError akan terhasil.

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)

Jika hanya * argumen ditentukan, argumen berikutnya mesti selalu dinyatakan sebagai argumen kata kunci.(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:Menerima berbilang hujah kata kunci sebagai kamus

Bilangan arbitrari argumen kata kunci boleh ditentukan dengan mentakrifkan argumen dengan ,** seperti dalam **kwargs.

Dalam fungsi, nama hujah diterima sebagai kamus yang kuncinya adalah kunci dan nilainya adalah nilai.

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

Ia juga boleh digunakan bersama dengan hujah kedudukan.

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}

Dengan menentukan objek kamus dengan ** sebagai argumen semasa memanggil fungsi, adalah mungkin untuk mengembangkannya dan menyampaikannya sebagai argumen masing-masing.

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

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

Argumen yang bertanda ** hanya boleh ditakrifkan pada penghujung hujah. Mentakrifkan hujah lain selepas hujah yang ditandakan dengan ** akan mengakibatkan ralat SyntaxError.

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

# SyntaxError: invalid syntax