نحوه استفاده از آرگومان های طول متغیر (*args، **kwargs) در پایتون

کسب و کار

آرگومان‌های تابع زیر احتمالاً رایج‌ترین آرگومان‌هایی هستند که وقتی به کد پایتون نگاه می‌کنید و می‌گویید: «این چیست؟

  • *args
  • **kwargs

هر تعداد آرگومان (آگومان های با طول متغیر) را می توان با الحاق یک ستاره به آرگومان در تعریف تابع به صورت زیر مشخص کرد.

  • *
  • **

نام *args،**kwargs اغلب به عنوان یک قرارداد استفاده می شود. با این حال، نام های دیگر تا زمانی که * و ** در ابتدا باشند قابل قبول هستند. کد نمونه زیر از نام *args,**kwargs استفاده می کند.

جزئیات زیر در زیر توضیح داده شده است.

  • *args:چندین آرگومان را به صورت تاپل می پذیرد
  • **kwargs:چندین آرگومان کلیدواژه را به عنوان فرهنگ لغت می پذیرد

*args:چندین آرگومان را به صورت تاپل می پذیرد

تعداد دلخواه آرگومان را می توان با تعریف آرگومان با *، مانند *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

چندین آرگومان به صورت یک تاپل در تابع دریافت می شود. در مثال، تابع sum() یک تاپل ارسال می شود تا مجموع را محاسبه کند.

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

همچنین می توان آن را با آرگومان موقعیت ترکیب کرد.

مقدار مشخص شده پس از (در سمت راست) آرگومان موقعیتی به عنوان یک تاپل به args منتقل می شود. اگر فقط یک آرگومان موقعیتی وجود داشته باشد، یک تاپل خالی است.

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

ممکن است ابتدا آرگومان هایی که با * مشخص شده اند تعریف شوند. با این حال، در این مورد، آرگومان هایی که دیرتر از *args تعریف می شوند، باید به شکل کلمه کلیدی مشخص شوند. اتفاقا قالب کلمه کلیدی فرم “نام آرگومان = مقدار” است.

آخرین مقدار به طور خودکار به آرگومان موقعیتی منتقل نمی شود. بنابراین، اگر به عنوان آرگومان کلمه کلیدی مشخص نشود، خطای TypeError ایجاد می شود.

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)

اگر فقط آرگومان های * مشخص شده باشند، آرگومان های بعدی باید همیشه به عنوان آرگومان های کلمه کلیدی مشخص شوند.(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:چندین آرگومان کلیدواژه را به عنوان فرهنگ لغت می پذیرد

تعداد دلخواه آرگومان های کلمه کلیدی را می توان با تعریف آرگومان ها با،** مانند **kwargs مشخص کرد.

در تابع، نام آرگومان به صورت دیکشنری دریافت می شود که کلید آن کلید و مقدار آن مقدار است.

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

همچنین می توان آن را همراه با آرگومان موقعیت استفاده کرد.

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}

با تعیین شی دیکشنری با ** به عنوان آرگومان هنگام فراخوانی تابع، می توان آن را گسترش داد و به عنوان آرگومان مربوطه ارسال کرد.

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

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

آرگومان هایی که با ** علامت گذاری شده اند فقط در انتهای آرگومان تعریف می شوند. تعریف آرگومان دیگری پس از آرگومان مشخص شده با ** منجر به خطای SyntaxError می شود.

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

# SyntaxError: invalid syntax
Copied title and URL