تكرار السؤال: …
الإجابة المختصرة
الـ module ملف Python واحد، والـ package مجلد يجمع modules (عادةً مع __init__.py). عند import تبحث Python في sys.path، وتنفذ الموديول مرة واحدة، ثم تخزنه في sys.modules لتعيد استخدامه في أي import لاحق.
الشرح
لأن الموديول يُنفذ عند أول import، فإن أي side effect في مستواه الأعلى (اتصال بقاعدة بيانات أو قراءة ملفات) يحدث عند الاستيراد، وهذا يبطئ التشغيل ويصعّب الاختبار. الاستيراد الدائري (circular import) يحدث عندما يستورد موديولان بعضهما أثناء التهيئة فيرى أحدهما الآخر نصف مهيأ. الحلول: نقل الكود المشترك لموديول ثالث، أو تأجيل الاستيراد داخل الدالة، أو استخدام TYPE_CHECKING للأنواع فقط.
مثال بالكود
# app/services.py
from typing import TYPE_CHECKING
if TYPE_CHECKING: # يُقرأ فقط بواسطة type checker
from app.models import User
def greet(user: "User") -> str:
return f"Hello {user.name}"أخطاء شائعة
- تنفيذ عمل ثقيل أو اتصالات شبكة في المستوى الأعلى للموديول.
- حل الاستيراد الدائري بنسخ الكود بدل إعادة تنظيم الاعتماديات.