python - شرح - منتديات بايثون




بيثون جيتات يعادل القواميس؟ (2)

نلقي نظرة أيضا على فئة defaultdict وحدة المجموعات. إنه أمر يمكنك من أجله تحديد ما يجب عليه إرجاعه عند عدم العثور على المفتاح. مع ذلك يمكنك القيام بأشياء مثل:

class MyDefaultObj:
    def __init__(self):
        self.a = 1

from collections import defaultdict
d = defaultdict(MyDefaultObj)
i = d['NonExistentKey']
type(i)
<instance of class MyDefalutObj>

والذي يسمح لك باستخدام اتفاقية مألوفة د.

ومع ذلك ، كما قال mikej ، يعمل .get () أيضًا ، ولكن هنا هو النموذج أقرب إلى مثال JavaScript الخاص بك:

d = {}
i = d.get('NonExistentKey') or MyDefaultObj()
# the reason this is slightly better than d.get('NonExistent', MyDefaultObj())
# is that instantiation of default value happens only when 'NonExistent' does not exist.
# With d.get('NonExistent', MyDefaultObj()) you spin up a default every time you .get()
type(i)
<instance of class MyDefalutObj>

ما هي الطريقة الأكثر إيجازاً للقول ، في بيثون ، "أعطني dict['foo'] إذا كانت موجودة ، وإذا لم يكن الأمر كذلك ، أعطني bar القيمة الآخر"؟ إذا كنت تستخدم كائنًا بدلاً من القاموس ، getattr :

getattr(obj, 'foo', bar)

ولكن هذا يثير خطأً رئيسياً إذا حاولت استخدام قاموس بدلاً من ذلك (تمييز أجده مؤسفًا قادمًا من JavaScript / CoffeeScript). وبالمثل ، في JavaScript / CoffeeScript كنت أكتب فقط

dict['foo'] || bar

ولكن ، مرة أخرى ، هذا ينتج KeyError. ماذا أفعل؟ شيء مقتضب ، من فضلك!


dict.get(key, default) بإرجاع dict[key] إذا كان المفتاح في dict ، بإرجاع الافتراضي.

لاحظ أن dict.get(key) default هو " None لذا إذا قلت dict.get(key) ولم يكن المفتاح قيد KeyError ، KeyError ذلك إلى إرجاع بلا بدلاً من رفع KeyError كما يحدث عند استخدام رمز الوصول إلى المفتاح [] .





python