سؤال

لنفترض أن لدي الطرق التالية:

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)

يبدو واضحا الآن..

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top