python الدوال - بيثون جيتات يعادل القواميس؟




في بايثون (3)

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

getattr(obj, 'foo', bar)

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

dict['foo'] || bar

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


Answers

نلقي نظرة أيضا على فئة 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.get(key, default) بإرجاع dict[key] إذا كان المفتاح في dict ، بإرجاع الافتراضي.

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


في Python 3.4 ، يمكنك أيضًا استخدام وحدة pathlib الجديدة pathlib :

from pathlib import Path
path = Path("/my/directory/filename.txt")
try:
    if not path.parent.exists():
        path.parent.mkdir(parents=True)
except OSError:
    # handle error; you can also catch specific errors like
    # FileExistsError and so on.




python