خطای KeyError در پایتون
توسط: vahit
در پایتون و هنگام کار با نوع دادهی دیکشنری (dictionary) اگر کلیدی که مقدار اون رو درخواست دادیم وجود نداشته باشه خطای KeyError دریافت میکنیم:
1 2 3 4 5 6 |
>>> dict1 {1: 4, 2: 5} >>> dict1[3] Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: 3 |
طبیعی هست که این خطا باعث میشه که اجرای برنامه با مشکل مواجه بشه. حالا سؤالی که پیش میاد این هست که: I) برای جلوگیری از این مشکل چی کار کنیم؟
اگه روال برنامه به نوعی باشه که لازم داشته باشیم مقدار کلیدهایی که توی دیکشنری پیشبینی نشدن رو یه مقدار پیشفرض برگردونه II) باید چی کار بکنیم؟
جواب سؤالات بالا رو میتونیم با متد try…except بدیم. به این صورت که دستور print یا هر دستوری که به مقدار یه کلید توی دیکشنری میخواد دست پیدا کنه رو توی قسمت try مینویسیم و در قسمت except وقوع خطا رو بررسی میکنیم و اگه خطایی رخ داد (I) برای حل سؤال اوّل یه پیغام برمیگردونیم و کاربر رو مطلع میکنیم و متناسب با اون کنترل رو به قسمت صحیح برنامه منتقل میکنیم یا (II) برای حل سؤال دوّم یه مقدار پیشفرض برمیگردونیم و بدون اینکه کاربر بدونه برنامه به کارش ادامه میده :)
1 2 3 4 5 6 7 8 |
>>> dict1 {1: 'One', 2: 'Two'} >>> try: ... print(dict1[3]) ... except KeyError as err: ... print("The dictionary don't has this key.") ... The dictionary don't has this key. |
1 2 3 4 5 6 7 8 |
>>> dict1 {1: 'One', 2: 'Two'} >>> try: ... print(dict1[3]) ... except KeyError as err: ... print("Number") ... Number |
امّا آیا این تنها راهیه که داریم، طبیعی هست که جواب نه باشه. نوع داده دیکشنری یه صفت به اسم get داره که کارش همینه:
1 2 |
get(...) D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None. |
یعنی هر دو سؤال بالا رو توی یه خط هم میشه جواب داد:
1 2 |
>>> print(dict1.get(3, "The dictionary don't has this key.")) The dictionary don't has this key. |
1 2 |
>>> print(dict1.get(3, "Number")) Number |
نکته: به syntax این صفت و تفاوتش با syntax دیکشنری خالی توجه کنید!
«منبع»
البته استفاده از collections.defaultdict هم خالی از لطف نیست.
http://itmaybeahack.com/book/python-2.6/html/p02/p02c11_adv_map.html#default-dictionaries
http://docs.python.org/2/library/collections.html#collections.defaultdict
ممنونم ازت شاهین جان :)
نمیدونم چرا دوباره باید تأییدت میکردم تا نظرت دیده شه؟!
انگار ایمیلت رو عوض کردی درسته؟
البته میشه از عملگر in هم استفاده کرد که با کد تو حجمش یکی میشه چون هر دو تا یه شرط داره برای اینکه بفهمه کلید تو دیکشنری بوده یا نه.