for في python ، ماذا يعني dict.pop(أ ، ب)؟



facial and (4)

def func(*args): 
    pass

عندما تقوم بتعريف دالة بهذه الطريقة ، فسوف تكون *args عبارة عن مجموعة من الوسيطات التي تم تمريرها إلى الدالة. هذا يسمح لوظائفك بالعمل دون معرفة في وقت مبكر عدد الحجج التي سيتم تمريرها إليها.

يمكنك القيام بذلك باستخدام وسيطات الكلمات الرئيسية أيضًا ، باستخدام **kwargs :

def func2(**kwargs): 
    pass

انظر: قوائم الحجج التعسفية

في حالتك ، قمت بتعريف الفصل الذي يتصرف مثل القاموس. يتم تعريف طريقة dict.pop باسم pop(key[, default]) .

لا تستخدم الطريقة الخاصة بك المعلمة default . ولكن من خلال تعريف الطريقة الخاصة بك باستخدام *args و dict.pop() *args إلى dict.pop() ، فإنك تسمح للمتصل باستخدام المعلمة default .

بمعنى آخر ، يجب أن تكون قادرًا على استخدام طريقة pop الخاصة بالفئة مثل dict.pop :

my_a = a()
value1 = my_a.pop('key1')       # throw an exception if key1 isn't in the dict
value2 = my_a.pop('key2', None) # return None if key2 isn't in the dict
class a(object):
    data={'a':'aaa','b':'bbb','c':'ccc'}
    def pop(self, key, *args):
            return self.data.pop(key, *args)#what is this mean.

b=a()
print b.pop('a',{'b':'bbb'})
print b.data

self.data.pop(key, *args) ← ------ لماذا توجد حجة ثانية؟


Answer #1

self.data طريقة pop self.data (مثل self.data ، أي {'a':'aaa','b':'bbb','c':'ccc'} ، هنا) وسيطتين - راجع المستندات

الوسيطة الثانية ، default ، هي ما يعود pop إذا كانت الوسيطة الأولى ، key ، غائبة. (إذا قمت بالاتصال pop واحد مع وسيطة واحدة فقط ، فهذا key ، يثير استثناء في حالة غياب المفتاح).

في المثال الخاص بك ، print b.pop('a',{'b':'bbb'}) ، هذا غير ذي صلة لأن 'a' هو مفتاح في b.data . ولكن إذا قمت بتكرار هذا السطر ...:

b=a()
print b.pop('a',{'b':'bbb'})
print b.pop('a',{'b':'bbb'})
print b.data

سترى أنه يحدث فرقًا: يزيل pop الأول المفتاح 'a' ، لذا في pop الثاني ، يتم إرجاع الوسيطة default فعليًا (نظرًا لأن 'a' أصبح الآن غير موجود في b.data ).


Answer #2

الكثير من الأسئلة هنا. أرى اثنين على الأقل ، ربما ثلاثة:

  • ماذا يفعل البوب ​​(أ ، ب)؟ / لماذا هناك حجة ثانية؟
  • ما هو *args تستخدم *args ل؟

تمت الإجابة عن السؤال الأول بشكل بسيط في مرجع مكتبة Python القياسية :

pop (مفتاح [، افتراضي])

إذا كان المفتاح موجودًا في القاموس ، فقم بإزالته وإرجاع قيمته ، وإلا اعاد القيمة الافتراضية. إذا لم يتم إعطاء الإعدادات الافتراضية ولم يكن المفتاح موجودًا في القاموس ، فسيتم رفع KeyError.

يتم تناول السؤال الثاني في مرجع لغة Python :

إذا كان النموذج "* identifier" موجودًا ، فسيتم تهيئته إلى مجموعة تتلقى أي معلمات زائدة عن الموضع ، متخلفة عن المجموعة الفارغة. إذا كان النموذج "*** معرّفًا" موجودًا ، فسيتم تهيئته إلى قاموس جديد يتلقى أي وسيطات كلمات رئيسية زائدة ، بحيث يتحول إلى قاموس فارغ جديد.

بمعنى آخر ، تأخذ الدالة pop وسيطتين على الأقل. الأول والثاني يحصل على أسماء self key ؛ والبقية محشوة في صف يسمى args .

ما يحدث في السطر التالي عندما يتم تمرير *args في الدعوة إلى self.data.pop هو معكوس هذا - يتم توسيع نطاق tuple *args إلى المعلمات الموضعية التي يتم تمريرها. هذا موضح في مرجع لغة Python :

إذا ظهر تعبير * syntax * في استدعاء الدالة ، يجب أن يتم تقييم التعبير إلى تسلسل. يتم التعامل مع عناصر من هذا التسلسل كما لو كانت حججًا موضعية إضافية

باختصار ، يريد a.pop() أن يكون مرناً وأن يقبل أي عدد من المعلمات الموضعية ، بحيث يمكنه تمرير هذا العدد غير المعروف من المعلمات self.data.pop() إلى self.data.pop() .

هذا يمنحك المرونة. تحدث data لتكون dict الآن ، ولذلك self.data.pop() يأخذ معلمة واحدة أو اثنين؛ ولكن إذا قمت بتغيير data لتكون من النوع الذي أخذ 19 معلمة لاستدعاء self.data.pop() لن تحتاج إلى تغيير فئة على الإطلاق. لا يزال عليك تغيير أي رمز يسمى a.pop() لتمرير المعلمات 19 المطلوبة بالرغم من ذلك.


Answer #3
>>> def func(a, *args, **kwargs):
...   print 'a %s, args %s, kwargs %s' % (a, args, kwargs)
... 
>>> func('one', 'two', 'three', four='four', five='five')
a one, args ('two', 'three'), kwargs {'four': 'four', 'five': 'five'}
>>> def anotherfunct(beta, *args):
...   print 'beta %s, args %s' % (beta, args)
... 
>>> def func(a, *args, **kwargs):
...   anotherfunct(a, *args)
... 
>>> func('one', 'two', 'three', four='four', five='five')
beta one, args ('two', 'three')
>>> 




dictionary