هنگام کار با دیکشنری ها در پایتون، اغلب با آن برخورد می کنید KeyError استثناها.

دیکشنری ها ساختار داده های داخلی جفت های ارزش کلیدی هستند. بنابراین می توانید با استفاده از کلید مربوطه مانند زیر، یک مقدار را در زمان ثابت جستجو کنید: dict[key] برمی گرداند value. اما اگر کلید در فرهنگ لغت وجود نداشته باشد چه؟ خوب، آن زمانی است که شما یک KeyError در پایتون

چند راه مختلف وجود دارد که می توانید با چنین مواردی کنار بیایید KeyError استثناها. می توانید آنها را به صراحت مدیریت کنید یا از روش های فرهنگ لغت خاصی برای تنظیم مقادیر پیش فرض برای کلیدهای از دست رفته استفاده کنید. و در این آموزش با کدنویسی یک مثال ساده به روش های زیر نگاه خواهیم کرد:

  • استفاده کردن try-except بلوک ها
  • با استفاده از روش دیکشنری get()
  • استفاده کردن defaultdict از collections مدول

بیا شروع کنیم.

1. روش رسیدگی به استثنائات KeyError با try-except بلوک ها

بیایید با مرور زمان وقوع خطاهای کلیدی و اینکه چگونه می‌توانیم با استفاده از این استثنائات مدیریت کنیم، شروع کنیم try-except بلوک ها

چه زمانی یک خطای کلیدی رخ می دهد؟

در پایتون، a KeyError استثنا زمانی رخ می دهد که شما سعی می کنید به مقدار مربوط به کلیدی که وجود ندارد دسترسی پیدا کنید. موارد زیر را در نظر بگیرید books فرهنگ لغت:

books = {
	"1984": "George Orwell",
	"To Kill a Mockingbird": "Harper Lee",
	"The Great Gatsby": "F. Scott Fitzgerald"
}

در books فرهنگ لغت، کلیدها عناوین کتاب ها و مقادیر نام نویسندگان است. بنابراین می توانید نویسنده کتاب را با استفاده از عنوان به عنوان کلید جستجو کنید.

حال بیایید سعی کنیم نویسنده کتابی را که در فرهنگ لغت وجود ندارد جستجو کنیم:

print(books["Brave New World"])

با موارد زیر مواجه خواهید شد KeyError استثنا:

Traceback (most recent call last):
  File "/home/balapriya/keyerror/main.py", line 7, in <module>
	print(books["Brave New World"])
      	~~~~~^^^^^^^^^^^^^^^^^^^
KeyError: 'Brave New World'

روش رسیدگی به استثناء خطاهای کلیدی

شما به صراحت می توانید از عهده چنین مواردی برآیید KeyError استثنا با استفاده از try-except بلوک هایی مانند این:

try:
	value = dictionary[key]
except KeyError:
	value = default_value

اینجا:

  • ما بلوک کدی را که ممکن است استثنایی ایجاد کند در بلوک try قرار می دهیم. در این حالت سعی می کنیم به مقدار مربوط به کلید دسترسی پیدا کنیم.
  • اگر یک KeyError مطرح شده است، ما آن را در رسیدگی به except با اختصاص یک مقدار پیش فرض مسدود کنید.
پیشنهاد می‌کنیم بخوانید:  نحوه غیرفعال کردن هشدارها در پایتون

برای books به عنوان مثال فرهنگ لغت، ما داریم:

books = {
	"1984": "George Orwell",
	"To Kill a Mockingbird": "Harper Lee",
	"The Great Gatsby": "F. Scott Fitzgerald"
}

try:
    # Try to access the key "Brave New World"
	author = books["Brave New World"]  
    # Catch the KeyError if the key does not exist
except KeyError:  
	author = "Book not found"  

print(author) 

ما سعی می کنیم دوباره نویسنده «دنیای جدید شجاع» را جستجو کنیم. اما این بار KeyError بلوک غیر را فعال می کند و “کتاب یافت نشد” را دریافت می کنیم.

Output >>> Book not found

2. روش رسیدگی به خطاهای کلیدی با استفاده از get() روش دیکشنری

راه دیگر برای رسیدگی به کلیدهای از دست رفته بدون ایجاد استثنا، استفاده از آن است get() روش فرهنگ لغت

می توانید استفاده کنید get() روش روی هر شیء فرهنگ لغت معتبر را get() متد مقدار یک کلید داده شده را در صورت وجود برمی گرداند – در غیر این صورت، یک مقدار پیش فرض مشخص شده را برمی گرداند. می توانید از آن به این صورت استفاده کنید:

value = dictionary.get(key, default_value)

در اصل، get() روش تلاش می کند گرفتن مقدار کلید مشخص شده:

  • اگر کلید وجود داشته باشد، مقدار مربوطه را برمی گرداند.
  • اگر کلید وجود نداشته باشد، آن را برمی گرداند default_value.

حالا بیایید از get() روش روی فرهنگ لغت کتاب در فراخوانی متد، «Book not found» را به عنوان مقدار پیش‌فرض ارسال می‌کنیم.

books = {
	"1984": "George Orwell",
	"To Kill a Mockingbird": "Harper Lee",
	"The Great Gatsby": "F. Scott Fitzgerald"
}

# Try to get the value for "Brave New World"
author = books.get("Brave New World", "Book not found")  
print(author)  

همانطور که انتظار می رود، باید خروجی زیر را دریافت کنید:

Output >>> Book not found

توجه داشته باشید: get() روش فرهنگ لغت اصلی را تغییر نمی دهد. اگر می خواهید کلید گم شده را با مقدار پیش فرض اضافه کنید، می توانید از آن استفاده کنید setdefault() روش در عوض با نحو dictionary.setdefault(key,default_value).

3. روش استفاده defaultdict از collections مدول

یک راه (بسیار) تمیزتر برای رسیدگی به خطاهای کلیدی استفاده از آن است defaultdict از پایتون collections مدول. Defaultdict قابلیت‌های فرهنگ لغت داخلی پایتون را با این امکان گسترش می‌دهد که به شما امکان می‌دهد یک مقدار پیش‌فرض برای کلیدهایی که به‌صراحت تنظیم نشده‌اند، ارائه دهید.

پیشنهاد می‌کنیم بخوانید:  جستجوی باینری در JavaScriptSearching یکی از متداول ترین کارهایی است که در حوزه علوم کامپیوتر انجام می شود. الگوریتم‌ها و ساختارهای داده زیادی برای کارآمدتر کردن جستجو وجود دارد. در این مقاله به ایده پشت باینری جستجو و روش پیاده سازی آن در جاوا اسکریپت خواهیم پرداخت. جستجوی دودویی بسیار ساده است، ...

را defaultdict سازنده یک تابع کارخانه پیش فرض را به عنوان آرگومان می گیرد. این تابع کارخانه نامیده می شود بدون آرگومان هایی برای ارائه یک مقدار پیش فرض برای یک کلید غیر موجود.

نحو برای ایجاد a defaultdict به شرح زیر است:

from collections import defaultdict

# Syntax
defaultdict(default_factory)

بیایید یک را ایجاد کنیم defaultdict از books فرهنگ لغت همانطور که نشان داده شده است:

from collections import defaultdict

books = {
	"1984": "George Orwell",
	"To Kill a Mockingbird": "Harper Lee",
	"The Great Gatsby": "F. Scott Fitzgerald"
}

books_default = defaultdict(lambda: "Book not found",books)  
# Access the key "Brave New World"
author = books_default["Brave New World"]  
print(author) 

برای تابع پیش‌فرض کارخانه، از یک تابع لامبدا ساده استفاده می‌کنیم که رشته «کتاب یافت نشد» را برمی‌گرداند. هر زمان که بخواهید به کلیدی دسترسی پیدا کنید که در فرهنگ لغت وجود ندارد، این تابع فراخوانی می شود.

اجرای قطعه بالا باید به شما نیز بدهد:

Output >>> Book not found

استفاده کردن defaultdict زمانی که نیاز به دسترسی پویا به بسیاری از کلیدها دارید می تواند مفید باشد.

نتیجه

و این یک بسته بندی است! امیدوارم روش مدیریت استثناهای KeyError در پایتون را یاد گرفته باشید. بیایید آنچه را که یاد گرفتیم مرور کنیم:

  • برای رسیدگی صریح الف KeyError، می توانید کد دسترسی به فرهنگ لغت را با یک بپیچید try مسدود کنید و آن را بگیرید KeyError در except مسدود کردن.
  • استفاده کنید get() روشی برای دسترسی به مقدار یک کلید، با گزینه ای برای برگرداندن یک مقدار پیش فرض در صورت عدم وجود کلید.
  • می توانید a را مقداردهی اولیه کنید defaultdict از collections ماژول با یک تابع کارخانه که مقدار پیش فرض را برمی گرداند.

اگر می خواهید در مورد مدیریت استثنا در پایتون بیاموزید، Python Try and Except Statements – How to Handle Exceptions in Python را بخوانید.