لقد حصلنا على حالة نريد فيها تحديث وحدة بايثون واختبارها دون إعادة تشغيل المترجم. يعد هذا مفيدًا بشكل خاص أثناء التطوير عندما تقوم بتعديل ملفات الوحدة النمطية خارجيًا وتريد أن تنعكس هذه التغييرات على الفور. تسمح لنا لغة Python بإعادة تحميل وحدة تم استيرادها مسبقًا باستخدام وظيفة reload(). على سبيل المثال إذا قمت بتحرير ملف الأداة المساعدة utils.py أثناء تشغيل البرنامج النصي، فإن إعادة التحميل تتيح لك إعادة استيراد المحتوى المحدث دون إعادة تشغيل Python Shell.
متى يجب عليك إعادة تحميل الوحدة النمطية؟
- أثناء التصحيح أو الاختبار المباشر
- عند استخدام المترجمين الفوريين التفاعليين مثل IPython أو Jupyter
- أثناء تطوير المكونات الإضافية أو الأنظمة المعيارية
- لتعكس التغييرات التي تم إجراؤها في ملفات .py الخارجية دون إعادة تشغيل الجلسة
إعادة تحميل الوحدات في Python 2.x
في Python 2.x، يمكنك استخدام وظيفة reload() المضمنة مباشرةً لإعادة تحميل وحدة تم استيرادها مسبقًا.
Pythonimport mymodule # Modify 'mymodule.py' externally here... reload(mymodule)
توضيح:
- يتم استيراد mymodule أولاً باستخدام import.
- بعد إجراء تغييرات خارجية على mymodule.py، يؤدي استدعاء reload(mymodule) إلى إعادة تحميل الإصدار المحدث دون إعادة تشغيل المترجم.
- ليست هناك حاجة لإعادة الاستيراد - يعمل reload() على كائن الوحدة النمطية الذي تم استيراده بالفعل.
إعادة تحميل الوحدات في Python 3.0 إلى 3.3
في إصدارات Python 3.0 إلى 3.3، تمت إزالة وظيفة reload() المضمنة. بدلاً من ذلك تحتاج إلى استيراده من الوحدة النمطية imp.
Pythonimport mymodule import imp # Modify 'mymodule.py' externally... imp.reload(mymodule)
توضيح:
- يتم استيراد mymodule الأول كالمعتاد.
- توفر الوحدة النمطية imp وظيفة reload() خلال نطاق الإصدار هذا.
- بعد التحرير، يقوم mymodule.py imp.reload(mymodule) بإعادة تحميل الوحدة بالتغييرات المحدثة.
ملاحظة: تم إهمال الوحدة imp اعتبارًا من Python 3.4 وتم استبدالها بـ importlib.
جافا فرز قائمة الصفيف
إعادة تحميل الوحدات في Python 3.4 وما فوق
بدءًا من Python 3.4، الطريقة الموصى بها لإعادة تحميل الوحدة هي استخدام importlib.reload().
Pythonimport mymodule import importlib # Modify 'mymodule.py' externally... importlib.reload(mymodule)
توضيح:
- يتم استيراد mymodule أولاً بشكل طبيعي.
- ثم يقوم importlib.reload(mymodule) بإعادة تحميل الوحدة المحدثة.
- هذه هي الطريقة الحالية والرسمية لإعادة تحميل الوحدات في Python 3.4+.
ملحوظة: استخدم هذه الطريقة في جميع نصوص ودفاتر ملاحظات Python الحديثة عند تغيير وحدة الاختبار.
هل يمكنك تفريغ وحدة في بايثون؟
لا توفر Python حاليًا طريقة مدمجة لتفريغ الوحدة بالكامل بمجرد استيرادها. بمجرد تحميل الوحدة النمطية في الذاكرة، تظل متاحة في sys.modules حتى ينتهي البرنامج. على الرغم من أنه يمكنك حذف وحدة من sys.modules، إلا أن هذا لا يضمن إزالتها بالكامل من الذاكرة أو اختفاء مراجعها:
Pythonimport mymodule import sys del sys.modules['mymodule']
سيؤدي هذا فقط إلى إزالة الوحدة من ذاكرة التخزين المؤقت sys.modules. إذا كان أي متغير أو كائن لا يزال يشير إلى الوحدة، فلن يتم إلغاء تحميله بالكامل.
لماذا لا يتم دعم التفريغ؟
- تدير Python الوحدات النمطية عالميًا في الذاكرة.
- قد يؤدي التفريغ ديناميكيًا إلى سلوك غير متناسق إذا كانت أجزاء من التعليمات البرمجية الخاصة بك لا تزال تحتوي على إشارات إلى الوحدة القديمة.