کتابخانهی درهم
داور به اینترنت دسترسی ندارد؛ یک سرور کتابخانهی آزمایشی به نشانی
http://127.0.0.1:8000/جای آن جواب میدهد (بالای کدت آمده). کافی است همانطور که در صورت سؤال آمده ازrequests.getاستفاده کنی.
در این تمرین، شما باید تابعی به نام find_category را پیادهسازی کنید که با استفاده از API یک کتابخانه آنلاین، موضوع یک بخش از کتابخانه را تشخیص دهد. این کتابخانه فقط کتابهای مربوط به موضوعات فیزیک، ریاضی و شطرنج را شامل میشود. هر کتاب نیز تنها به یک موضوع تعلق دارد.
سیستم کتابخانه به این صورت کار میکند که هر بخش از کتابخانه دارای یک آدرس اینترنتی (URL) منحصربهفرد است. با ارسال یک درخواست (request) به این آدرس، لیست کتابهای موجود در آن بخش، در قالب یک فایل JSON دریافت میشود.
فایل JSON دریافتی شامل یک لیست از کتابها است. هر کتاب دارای دو ویژگی اصلی است:
name– نام کتاب را نشان میدهدcategory– موضوع کتاب را مشخص میکند. مقدار آن میتواند یکی از سه مقدارphysics،mathیاchessباشد.
{"name": "Introduction to Calculus", "category": "math"}
🔹 حالتهای تشخیص
✅ حالت ۱: دستهبندی یکتا
اگر بخش موردنظر، حداقل یک کتاب داشته باشد و همهی کتابهای موجود در آن بخش دارای موضوع یکسانی باشند (یعنی مقدار
categoryهمهی کتابها یکسان باشد)، تابع باید رشتهی مربوط به آن موضوع را برگرداند.ورودی
[ {
"name":"The Road to Reality","category":"physics"}, {"name":"Something Deeply Hidden","category":"physics"} ]خروجی: "physics"
❌ حالت ۲: عدم امکان تشخیص موضوع
اگر بخش مورد نظر خالی باشد (هیچ کتابی در آن وجود نداشته باشد) یا اینکه کتابهای موجود در آن بخش دارای موضوعات مختلفی باشند (یعنی حداقل دو کتاب با مقادیر متفاوت
categoryوجود داشته باشند)، تابع باید رشتهیI can't recognize itرا برگرداند.ورودی (موضوعات مختلف)
[ {
"name":"Graph Theory","category":"math"}, {"name":"Fundamental of physics","category":"physics"} ]خروجی: "I can't recognize it"
ورودی (خالی)
[]
خروجی: "I can't recognize it"
⚠️ حالت ۳: خطای درخواست
اگر ارسال درخواست به آدرس داده شده با خطا مواجه شود (یعنی کد وضعیت HTTP پاسخ، چیزی غیر از
200باشد)، تابع باید عبارتBad Requestرا برگرداند.ورودیهای نامعتبر
find_category(
'quera-ir./math') # خروجی: "Bad Request" find_category('mokar.ir/machine-learning/') # خروجی: "Bad Request"
⚠️ حالت ۴: خطاهای غیرمنتظره
در هنگام کار با API و درخواستهای HTTP ممکن است خطاهای مختلفی رخ دهند که باید به آنها توجه کنید، مانند:
- خطای JSON نامعتبر: زمانی که سرور پاسخی بدهد که قابل تبدیل به JSON نباشد (حتی با کد وضعیت
200)در تمام این حالات، تابع باید عبارت
Bad Requestرا برگرداند.
📖 راهنمایی
برای بررسی کد وضعیت HTTP پاسخ، میتوانید از ویژگی
status_codeدر شیء پاسخ (response) استفاده کنید:
import requests
data = requests.get(link)
print(data.status_code)
برای مدیریت خطاها، میتوانید از بلوک
try-exceptاستفاده کنید. تمام کدی که احتمال بروز خطا دارد را درون بلوکtryقرار دهید و در صورت بروز هر گونه خطا، در بلوکexceptمقدارBad Requestرا برگردانید.
try:
# کدهای شما
except:
return "Bad Request"
✅ پاسخ نهایی
import requests
def find_category(url):
try:
# ارسال درخواست GET
response = requests.get(url, timeout=5)
# بررسی کد وضعیت
if response.status_code != 200:
return "Bad Request"
# تبدیل به JSON
books = response.json()
# اگر لیست خالی باشد
if not books:
return "I can't recognize it"
# دریافت دستهبندی اولین کتاب
first_category = books[0]["category"]
# بررسی یکسان بودن همهی دستهبندیها
for book in books:
if book["category"] != first_category:
return "I can't recognize it"
return first_category
except:
# هر گونه خطا (اتصال، JSON نامعتبر، timeout و ...)
return "Bad Request"
📄 main.py
📖 توضیح کد
- ارسال درخواست: با
requests.get(url, timeout=5)درخواست GET ارسال میشود - بررسی کد وضعیت: اگر
status_codeبرابر200نباشد،"Bad Request"برگردانده میشود - تبدیل به JSON: با
response.json()دادهها به لیست پایتون تبدیل میشوند - بررسی خالی بودن: اگر لیست خالی باشد،
"I can't recognize it"برگردانده میشود - بررسی یکسان بودن: اگر همهی کتابها دستهبندی یکسانی داشته باشند، آن دستهبندی برگردانده میشود. در غیر این صورت
"I can't recognize it" - مدیریت خطاها: هر گونه خطا (اتصال، JSON نامعتبر، timeout) با
try-exceptگرفته شده و"Bad Request"برگردانده میشود
فایلهای اضافه فقط جهت اجرای تست نمونه در پروژهی اولیه قرار گرفتهاند. در صورتی که نمیخواهید تست نمونه را روی سیستم خود اجرا کنید، نیازی به تغییر یا اجرای دیگر فایلها نیست. تنها فایل
main.pyرا تکمیل و ارسال نمایید.
🚀 پس از تکمیل تابع، میتوانید آن را با تستهای مختلف امتحان کنید و مطمئن شوید که همهی حالات را پوشش میدهد.
نمونهها
find_category("http://127.0.0.1:8000/physics/")'physics'
find_category("http://127.0.0.1:8000/chess/")
find_category("http://127.0.0.1:8000/math/")'chess' 'math'
find_category("http://127.0.0.1:8000/mixed/")
find_category("http://127.0.0.1:8000/empty/")"I can't recognize it" "I can't recognize it"
find_category('quera-ir./math')
find_category('mokar.ir/machine-learning/')'Bad Request' 'Bad Request'
find_category("http://127.0.0.1:8000/missing/")
find_category("http://127.0.0.1:8000/broken/")
find_category("http://127.0.0.1:8000/nowhere/")'Bad Request' 'Bad Request' 'Bad Request'
برای نوشتن پاسخ و دریافت امتیاز، ابتدا وارد حساب شوید.
ورود