پیشنیاز و هدف یادگیری
این بخش، گام 16 از مسیر «پایتون از صفر» است. هدف این درس تبدیل JSON به دیکشنری و ادغام با مقدارهای پیشفرض است. پیشنیاز: کتابخانهٔ استاندارد csv؛ خواندن جدول بدون نصب بسته. کتابخانهٔ خارجی لازم نیست؛ ماژولهای استاندارد همراه Python 3 هستند. اگر مفهوم قبلی برایتان ناآشناست، ابتدا مقالهٔ پیشنیاز را بخوانید و مثالش را اجرا کنید؛ حفظکردن کد جای فهم ورودی و خروجی را نمیگیرد.
مفهوم اصلی به زبان ساده
JSON قالب متنی تبادل داده است، نه کد پایتون. دیکشنری در حافظه یک شیء است ولی متن JSON رشته است. json.loads متن را به ساختار داده تبدیل و json.dumps مسیر عکس را طی میکند. در JSON کلیدها کوتیشن دوتایی دارند و null و true با None و True پایتون فرق دارند.
مسئلهٔ این درس
در پروژهٔ «بارگذاری تنظیمات برنامه» باید یک تابع مستقل بنویسید. میزکار ورودی نمونه را در request.json قرار میدهد؛ تابع solve دیکشنری داده را میگیرد و نتیجهٔ خود را برمیگرداند. در این قرارداد input لازم نیست و خواندن تعاملی از ترمینال ممکن است اجرای ارزیابی را متوقف کند. از مثال زیر شروع کنید و پیش از اجرای آن، شکل نتیجه را حدس بزنید.
نمونهکد قابل اجرا
import json
def solve(data):
try:
settings = json.loads(data['settings'])
except json.JSONDecodeError:
return {'error': 'invalid_json'}
if not isinstance(settings, dict):
return {'error': 'invalid_settings'}
result = {'theme': 'light', 'page_size': 10}
result.update({k: v for k, v in settings.items() if k in result})
return result
print(solve({'settings': '{"theme":"dark","extra":1}'}))نتیجهٔ مورد انتظار
{
"theme": "dark",
"page_size": 10
}توضیح مرحلهبهمرحله
تنظیمات پیشفرض شامل theme برابر light و page_size برابر ده است. متن settings را میخوانیم و فقط کلیدهای شناختهشده را اعمال میکنیم. اگر theme داده نشده باشد همان مقدار پیشفرض میماند. دادهٔ سطح اول باید یک شیء JSON باشد؛ لیست یا عدد قرارداد را برآورده نمیکند. مقدارهای کلیدهای شناختهشده در این تمرین از نوع معتبر ارسال میشوند.
قرارداد ورودی و خروجی
مثال فقط یک ورودی است، نه همهٔ مسئله. مقدارها را از data بخوانید و جواب نمونه را ثابت در برنامه ننویسید. نام کلیدها، نوع عدد و رشته و ترتیب فهرستها بخشی از قراردادند. در پروژه، بخش پایانی main.py نتیجهٔ تابع را در result.json ذخیره میکند؛ آن بخش را نگه دارید. موفقیت اجرای برنامه با درستبودن پاسخ و قبولی ارزیابی یکسان نیست.
خطای رایج و راه تشخیص
هرگز JSON را با eval نخوانید؛ eval کد اجرا میکند، در حالی که parser فقط داده میخواند. خطای JSONDecodeError را از خطای نوع ساختار جدا گزارش میکنیم. ادغام بدون محدودیت همهٔ کلیدها هم ممکن است تنظیمات ناشناخته را وارد برنامه کند.
تمرین مستقل و خودآزمایی
فقط theme را تغییر دهید و ببینید page_size حفظ میشود. سپس متن خراب، لیست JSON و کلید اضافی بفرستید و برای هر کدام نتیجهٔ مورد انتظار را مشخص کنید.
برای هر آزمایش، ورودی، خروجی مورد انتظار و خروجی واقعی را جدا بنویسید. اگر تفاوتی دیدید، یک نمونهٔ کوچکتر بسازید و تغییر را دوباره امتحان کنید. به جای اجرای چند تغییر همزمان، هر بار یک فرض را بررسی کنید. پس از فهم نمونه، پروژهٔ مرتبط را در میزکار حل کنید؛ ارزیابی با چند ورودی متفاوت انجام میشود و پاسخ ثابت نمونه پذیرفته نخواهد شد.
گام بعدی
موضوعهای این درس: json · loads · update. اگر میتوانید دلیل هر خط را توضیح دهید و ورودی تازهای را بدون دستکاری منطق اصلی حل کنید، به مقالهٔ بعدی بروید. هدف مسیر مقدماتی، تسلط بر همین رفتارهای کوچک و قابل آزمایش است؛ برای شروع پروژههای یادگیری ماشین عجله نکنید.
منابع و مطالعهٔ بیشتر
برای بررسی جزئیات و ادامهٔ مطالعه؛ متن این راهنما مستقلاً برای نوونتیکس نوشته شده است.
