✍️ dump داده را در یک فایل باز مینویسد و dumps متن JSON را در حافظه برمیگرداند. اگر ابتدا dumps کنیم و بعد آن رشته را با dump ذخیره کنیم، یک رشته JSON درون یک رشته JSON ساختهایم. فایل معتبر است، ولی بعد از load به جای دیکشنری، متن به دست میآید؛ این خطا از جنس نوع داده است، نه خطای نگارشی.
مثلاً هدف ذخیره {'total':12} است. یک بار dump روی دیکشنری کافی است. اگر متن ' {"total":12} ' را به عنوان داده رشتهای dump کنیم، نقلقولها escape میشوند و load همان رشته را تحویل میدهد. برنامه ممکن است تا زمان دسترسی به کلید total ظاهراً سالم باشد.
کد اولیه را اصلاح کن تا داده اصلی مستقیم به json.dump برسد. فایل را با UTF-8 بنویس؛ برای خواندن راحتتر خود فایل میتوانی ensure_ascii=False هم بدهی و بعد با json.load از همان مسیر بخوان. نتیجه بازخوانیشده باید همان ساختار داده باشد. خطای رایج دیگر، دادن مسیر به load بهجای شیء فایل است؛ load انتظار فایل باز دارد. پوشه موقت این تمرین نمونه را همانجا میسازد، بنابراین هیچ گزارش قبلی لازم نیست.
تابع آماده course_check از ورودی کپی عمیق میگیرد، تابع اصلی را اجرا میکند و تغییر ورودی را رد میکند؛ آن را نگه دار و فقط تابع اصلی را کامل کن.
فعالیت شما
تابع save_and_load_json(data) داده JSONپذیر با کلید رشتهای و عدد صحیح را در فایل report.json داخل پوشه موقت با json.dump و UTF-8 بنویسد؛ سپس با json.load بخواند و نتیجه را بدهد. داده را دوبار serialize نکن. None، ساختار خالی و تو در تو مجازند؛ save_and_load_json({'کل':12})={'کل':12}. ورودی تغییر نکند. course_check آماده را نگه دار؛ این تابع تغییر ورودی را رد و همان خروجی اصلی را برمیگرداند.