تمرير الوسائط المتغيرة المسماة في بيثون
-
09-06-2019 - |
سؤال
لنفترض أن لدي الطرق التالية:
def methodA(arg, **kwargs):
pass
def methodB(arg, *args, **kwargs):
pass
في الطريقة "أ" أرغب في استدعاء الطريقة "ب" لتمرير kwargs.ومع ذلك، يبدو أنه إذا قمت بتحديد methodA
كما يلي، سيتم تمرير الوسيطة الثانية كوسائط متغيرة موضعية وليست مسماة.
def methodA(arg, **kwargs):
methodB("argvalue", kwargs)
كيف أتأكد من تمرير **kwargs في الطريقة A كـ **kwargs إلى الطريقة B؟
المحلول
ضع العلامات النجمية قبل المتغير kwargs.وهذا يجعل بايثون يمرر المتغير (الذي يُفترض أنه قاموس) كوسيطات للكلمات الرئيسية.
methodB("argvalue", **kwargs)
نصائح أخرى
جانبا:عند استخدام الدوال بدلًا من التوابع، يمكنك أيضًا استخدام functools.partial :
import functools
def foo(arg, **kwargs):
...
bar = functools.partial(foo, "argvalue")
سيحدد السطر الأخير وظيفة "bar" والتي، عند استدعائها، ستستدعي foo مع تعيين الوسيط الأول على "argvalue" وجميع الوظائف الأخرى التي تم تمريرها للتو:
bar(5, myarg="value")
سوف اتصل
foo("argvalue", 5, myarg="value")
لسوء الحظ أن ذلك لن ينجح مع الأساليب.
بعض التجارب واكتشفت هذا:
طريقة التعريفA(arg, **kwargs):الطريقةB("argvalue"، **kwargs)
يبدو واضحا الآن..