الوحدات والحزم — هياكل البيانات
الوحدات والحزم (Modules & Packages)
عندما يكبر البرنامج، وضع كل شيء في ملف واحد يجعله صعب القراءة والتعديل. الحل: تقسيم الكود إلى ملفات، كل ملف مسؤول عن جانب واحد.
الوحدة (Module)
أي ملف .py هو وحدة. إذا كان لديك geometry.py:
# geometry.py
PI = 3.14159
def circle_area(r):
return PI * r ** 2يمكنك استخدامه من ملف آخر في نفس المجلد:
# main.py
import geometry
print(geometry.circle_area(2))
from geometry import circle_area
print(circle_area(2))طرق الاستيراد
| الصيغة | متى |
|---|---|
| import module | الأوضح: تعرف دائماً مصدر الدالة (math.sqrt) |
| from module import name | عندما تستخدم اسماً بكثرة |
| import module as alias | أسماء طويلة أو أعراف شائعة |
| from module import * | تجنبها: تجلب أسماء غير معروفة وقد تستبدل أسماءك |
if __name__ == "__main__"
عند استيراد وحدة، يُنفَّذ كل الكود الموجود في مستواها الأعلى. لكي تكتب كود تجربة لا يعمل إلا عند تشغيل الملف مباشرة:
def main():
print(circle_area(3))
if __name__ == "__main__":
main()المتغير __name__ يساوي "__main__" عند تشغيل الملف مباشرة، ويساوي اسم الوحدة عند استيرادها.
الحزمة (Package)
مجلد يجمع عدة وحدات:
shop/
__init__.py
products.py
cart.py
main.pyثم: from shop.cart import add_item. ملف __init__.py يحدد أن المجلد حزمة ويمكن أن يكون فارغاً.
المكتبة القياسية
Python تأتي بمئات الوحدات الجاهزة: math, random, datetime, json, csv, pathlib, collections, statistics, re... قبل أن تكتب شيئاً بنفسك، ابحث إن كان موجوداً.
المكتبات الخارجية
مكتبات من مطورين آخرين تُثبَّت بأداة pip (مثل requests و pandas). ستتعلم إدارتها مع البيئات الافتراضية في دورة Python المتقدمة.
أخطاء شائعة
- تسمية ملفك random.py أو json.py: يستورد Python ملفك بدل الوحدة الأصلية.
- الاستيراد الدائري: a.py يستورد b.py و b.py يستورد a.py.
تمرين
قسّم مشروع دفتر الدرجات من دورة الأساسيات إلى وحدتين: grades.py للدوال الحسابية، و main.py لقائمة الأوامر، واستخدم if __name__ == "__main__".
import math
import statistics
import random
from datetime import date, timedelta
from collections import Counter
import json as js # اسم مستعار (للتوضيح فقط)
# math
print(math.sqrt(16), math.ceil(4.2), math.floor(4.8))
# statistics بدل كتابة الدوال بأنفسنا
scores = [88, 92, 75, 92, 60]
print(statistics.mean(scores), statistics.median(scores), statistics.mode(scores))
# random مع seed للحصول على نتائج قابلة للتكرار
random.seed(7)
print(random.randint(1, 10), random.choice(["أ", "ب", "ج"]))
# datetime
today = date(2026, 1, 15)
print(today + timedelta(days=30))
# Counter
print(Counter("mississippi").most_common(2))
# json عبر الاسم المستعار
print(js.dumps({"lang": "Python"}))
# __name__ يساوي "__main__" لأننا نشغّل الملف مباشرة
def main():
print("تشغيل مباشر للوحدة")
if __name__ == "__main__":
main()
اختبر فهمك