لقد لاحظت أن معظم مبرمجي بايثون الجدد يجدون صعوبة في اكتشاف المتغيرات السحرية *args
و **kwargs
.
أولاً، دعني أخبرك أنه ليس من الضروري كتابة *args
أو **kwargs
بل يمكنك فقط الإكتفاء ب *
(العلامة النجمية) و هي بالطبع ضرورية. يمكنك أيضًا كتابة *var
و **vars
ولكن إتفق الجميع على كتابة *args
و **kwargs
ولهذا وجب عليك أنت أيضا إتباع الإتفاقية. والآن دعونا نلقي نظرة على *args
.
إستخدامات *args
يتم استخدام *args
و **kwargs
في الغالب في تعريفات الدوال. حيث تسمح لك بتمرير عدد غير محدد من الوسائط إلى دالة، لذلك عند تعريف الدالة لا تحتاج إلى معرفة عدد الوسائط التي سيتم تمريرها إلى الدالة. *يتم استخدام *args
لإرسال قائمة وسيطات متغيرة الطول بدون كلمات أساسية إلى الدالة. إليك مثال لمساعدتك في الحصول على فكرة واضحة:
def test_var_args(f_arg, *argv):
print("first normal arg:", f_arg)
for arg in argv:
print("another arg through *argv:", arg)
test_var_args('yasoob', 'python', 'eggs', 'test')
وهذا ينتج النتيجة التالية:
first normal arg: yasoob
another arg through *argv: python
another arg through *argv: eggs
another arg through *argv: test
آمل أن يكون هذا قد أزال أي ارتباك كان لديك. والآن دعونا نتحدث عن **kwargs
إستخدامات **kwargs
** kwargs
يسمح لك بتمرير طول متغير للوسائط إلى دالة. يجب عليك استخدام **kwargs
إذا كنت تريد التعامل مع الوسائط المسماة في إحدى الدوال. إليك مثال لتبدأ به:
def greet_me(**kwargs):
for key, value in kwargs.items():
print("{0} = {1}".format(key, value))
>>> greet_me(name="yasoob")
name = yasoob
يمكنك أن ترى كيف تعاملنا مع قائمة الوسائط ذات الكلمات الرئيسية في دالتنا. هذه مجرد أساسيات **kwargs
ويمكنك أن ترى مدى فائدتها. الآن دعونا نتحدث عن كيفية استخدام *args
و **kwargs
لاستدعاء دالة بقائمة أو قاموس من الوسائط.
استخدام *args و **kwargs لاستدعاء دالة
سنرى هنا كيفية استدعاء دالة باستخدام *args
و **kwargs
. فقط ضع في اعتبارك أن لديك هذه الدالة الصغيرة:
def test_args_kwargs(arg1, arg2, arg3):
print("arg1:", arg1)
print("arg2:", arg2)
print("arg3:", arg3)
يمكنك الآن استخدام *args
أو **kwargs
لتمرير الوسائط إلى هذه الدالة الصغيرة. و إليك كيفية القيام بذلك:
# أولا مع *args
>>> args = ("two", 3, 5)
>>> test_args_kwargs(*args)
arg1: two
arg2: 3
arg3: 5
# الأن مع **kwargs:
>>> kwargs = {"arg3": 3, "arg2": "two", "arg1": 5}
>>> test_args_kwargs(**kwargs)
arg1: 5
arg2: two
arg3: 3
و إذا كنت تريد استخدام كل هذه العناصر الثلاثة في الدوال، فالترتيب هو
some_func(fargs, *args, **kwargs)
متى تستخدمها؟
يعتمد الأمر حقًا على متطلباتك. حالة الاستخدام الأكثر شيوعًا هي عند إنشاء أدوات زخرفة الدوال. علاوة على ذلك، يمكن استخدامه في ترقيع القرد أيضًا. تصحيح القرد يعني تعديل بعض التعليمات البرمجية في وقت التشغيل. ضع في اعتبارك أن لديك فئة بها دالة تسمى get_info
والتي تستدعي واجهة برمجة التطبيقات (API) وترجع بيانات الاستجابة. إذا أردنا اختباره فيمكننا استبدال استدعاء API ببعض بيانات الاختبار. على سبيل المثال:
import someclass
def get_info(self, *args):
return "Test data"
someclass.get_info = get_info
أنا متأكد من أنه يمكنك التفكير في بعض حالات الاستخدام الأخرى أيضًا.
اكتشاف المزيد من بايثون العربي
اشترك للحصول على أحدث التدوينات المرسلة إلى بريدك الإلكتروني.