بايثون / برامج موثوقة / الدرس 7
الوحدات والحزم والبيئات المعزولة
نظم الشفرة ضمن حدود قابلة للاستيراد، وميّز بين حزمة الاستيراد والتوزيعة المثبتة والبيئة الافتراضية.
في هذه الصفحة
أهداف الدرس
- الوحدة تملك نطاق أسماء
- تسجيل قابلية التكرار والحدود
الوحدة تملك نطاق أسماء
الوحدة جزء قابل للاستيراد، وغالبا ملف مصدر، وتوفر نطاق أسماء. يربط import math اسم الوحدة، ويختار math.isqrt إحدى سماتها. يربط from math import isqrt السمة مباشرة في النطاق الحالي. توضح الاستيرادات الصريحة مصدر السلوك، بينما تخفي الاستيرادات الشاملة ذلك وتسبب تعارضات. ينفذ الاستيراد عادة الشفرة العليا عند التحميل الأول ثم يعيد استخدام كائن الوحدة المخزن. لذلك تجعل طلبات الشبكة أو الملفات أو الأسئلة التفاعلية في المستوى الأعلى المكتبة مفاجئة قبل استدعاء أي دالة.
الحزم ونقاط الدخول
تجمع حزمة الاستيراد العادية وحدات داخل مجلد يحتوي __init__.py، بينما تمثل حزم فضاءات الأسماء آلية أخرى مدعومة. ابدأ بحزمة عادية واضحة قبل البنى الأكثر مرونة. تعتمد الاستيرادات النسبية على بنية الحزمة، وتناسب تشغيلها بصيغة python -m package.module. تميز __name__ بين الاستيراد وتشغيل الوحدة كنقطة دخول. ضع تنسيق واجهة الأوامر في main واستدعها تحت شرط __name__ == "__main__"، لتبقى الدوال قابلة للاستعمال دون تشغيل التطبيق.
استخدم المكتبة قبل إضافة اعتماديات
توفر المكتبة القياسية وحدات لمهام شائعة. يستخدم المثال الجذر التربيعي الصحيح، فيتجنب التحويل العشري ويعطي أكبر عدد صحيح لا يتجاوز مربعه المدخل. اختر الاستيراد الذي يوضح البرنامج؛ ليس اختصار الأسماء هدفا. قد يحجب ملف محلي اسمه math.py وحدة المكتبة، فاختر أسماء المشروع بعناية. لا تعالج مشكلات الاستيراد بتعديل مسارات البحث عشوائيا؛ حدد المفسر الفعلي ومكان الوحدة الحالية ومسار الوحدة المستوردة أولا، فتكشف هذه الحقائق غالبا موضع الاختلاف.
import math
print(math.isqrt(80))
print(math.isqrt(81))
8
9
مربع ثمانية لا يتجاوز 80 بينما يتجاوزه مربع تسعة، وللعدد 81 جذر صحيح يساوي تسعة.
البيئة تختار الحزم المثبتة
تعزل البيئة الافتراضية سياق تثبيت حزم المفسر عن المشاريع الأخرى. أنشئها بالمفسر المقصود عبر python -m venv .venv. يعد التنشيط تسهيلا للطرفية، ويمكن أيضا استدعاء مفسر البيئة مباشرة. استخدم -m pip معه حتى تستهدف الإدارة البيئة نفسها. هذه أوامر إعداد وليست أمثلة تنفيذ في المقرر، ولا نحتاج هنا إلى تثبيت حزم. قد يختلف اسم حزمة الاستيراد عن اسم التوزيعة. يفحص المثال وحدة قياسية ليتجنب افتراض توزيعات خارجية مثبتة ويعطي نتيجة ثابتة.
import importlib.util
import sys
print(importlib.util.find_spec("json") is not None)
print("Python", sys.version_info.major)
True
Python 3
تعثر find_spec على json القياسية دون الاعتماد على توزيعة خارجية. ويبقى رقم الإصدار الرئيسي 3 في المفسرات المدعومة.
تسجيل قابلية التكرار والحدود
البيئة إعداد يمكن إعادة إنشائه، وليست مجلدا ينسخ إلى نظام الإصدارات أو صندوق حماية أمنيا. سجل إصدارات بايثون المدعومة والاعتماديات في بيانات المشروع وأعد بناء البيئة منها. يحل تثبيت الإصدارات لتطبيق وتحديد مجالات توافق لمكتبة مشكلتين مختلفتين. تسهل واجهة عامة صغيرة تغيير الوحدات داخليا دون تعديل المشروع كله. ضع قراءة الإعدادات وتحليل الأوامر قرب الحد الخارجي، ثم مرر القيم إلى الداخل. عند فشل الاستيراد راجع البنية وطريقة التشغيل والبيئة وحجب الأسماء قبل اختراع بدائل تخفي التثبيت المعطوب.
الأخطاء الشائعة وإصلاحها
ظهور ModuleNotFoundError بعد تثبيت الاعتمادية
- لماذا يحدث؟
- استهدف التثبيت والتنفيذ مفسرين مختلفين.
- كيف تصلحه؟
- استخدم مفسر البيئة الفعلية مع -m pip.
- كيف تتجنب تكراره؟
- سجل اختيار المفسر في إعدادات المحرر والطرفية.
حجب ملف محلي لوحدة قياسية
- لماذا يحدث؟
- يتعارض اسم الملف مع اسم مكتبة قابلة للاستيراد.
- كيف تصلحه؟
- أعد تسمية الوحدة المحلية وافحص مسار المستوردة.
- كيف تتجنب تكراره؟
- اختر أسماء مرتبطة بمجال المشروع.
تشغيل البرنامج كله عند استيراد مساعد
- لماذا يحدث؟
- تنفذ الشفرة العليا تشغيل التطبيق مباشرة.
- كيف تصلحه؟
- انقل التشغيل إلى main واحم استدعاءها بشرط نقطة الدخول.
- كيف تتجنب تكراره؟
- اختبر الاستيراد دون تفاعل أو آثار خارجية.
اختبر فهمك
1. اشرح فصل الحساب عن نقطة دخول سطر الأوامر.
اعرض الحل المشروح
ضع الدوال الحسابية في وحدة مجال مستقلة. حلل الوسائط في وحدة دخول أخرى، واستدع الدوال ونسق النتائج داخل main. احم استدعاءها وشغّل python -m the_package.entry. يجب ألا يحلل استيراد وحدة المجال الوسائط أو يكتب الملفات.
2. لماذا لا يعد نسخ .venv إلى جهاز آخر خطة نشر موثوقة؟
اعرض الحل المشروح
قد تتضمن البيئة مسارات مفسر وآثارا خاصة بالمنصة. أعد إنشاءها بمفسر مدعوم وبيانات اعتماديات مسجلة على الجهاز الهدف، ثم تحقق من الاستيراد والاختبارات هناك. وحدة النقل هي المصدر ومواصفات إعادة البناء، لا افتراضات مجلد جهاز واحد.
أهم ما تعلمته
- يكشف الاستيراد نطاقا وينفذ التهيئة.
- استخدم المفسر المقصود للتنفيذ والتثبيت.
- تعزل البيئة الاعتماديات لكنها ليست حدا أمنيا.