Python میں متغیر لمبائی کے دلائل (*args، **kwargs) کا استعمال کیسے کریں۔

کاروبار

مندرجہ ذیل فنکشن آرگیومینٹس شاید سب سے عام ہیں جو آپ کو اس وقت روکتے ہیں جب آپ Python کوڈ کو دیکھتے ہیں اور کہتے ہیں، "یہ کیا ہے؟

  • *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

اسے پوزیشن دلیل کے ساتھ بھی جوڑا جا سکتا ہے۔

پوزیشنی دلیل کے بعد (دائیں طرف) متعین کردہ قدر کو ٹیوپل کے طور پر آرگس میں منتقل کیا جاتا ہے۔ اگر صرف ایک پوزیشنی دلیل ہے، تو یہ ایک خالی ٹوپل ہے۔

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