الوحدات والحزم

مع نمو كودك، يصبح وضع كل شيء في ملف واحد غير حكيم. الوحدات تتيح لك تقسيم الكود إلى ملفات متعددة؛ الحزم تتيح لك تنظيم الوحدات ذات الصلة معاً. تعلم البرمجة المعيارية هو عتبة "الهندسة" الحقيقية.


1. ما هي الوحدة

في بايثون، ملف .py هو وحدة. يمكنك استخدام import لجلب الوظائف من وحدات أخرى:

مثال: استيراد وحدات المكتبة القياسية

PYTHON
# استيراد وحدة كاملة
import math
print(math.pi)              # 3.141592653589793
print(math.sqrt(16))        # 4.0

# استيراد دالة محددة
from random import randint
print(randint(1, 10))       # عدد صحيح عشوائي بين 1 و 10

# استيراد عناصر متعددة
from datetime import datetime, timedelta
now = datetime.now()
print(now)                  # الوقت الحالي
▶ جرّب الكود

تأتي بايثون مع مجموعة كبيرة من وحدات المكتبة القياسية — math, random, datetime, os, json... إنها موجودة بالفعل عند تثبيت بايثون، فقط import واستخدم.

💡 المكتبة القياسية هي واحدة من أكبر مزايا بايثون: "بطاريات مشمولة" هي فلسفة بايثون — معظم الوظائف اليومية موجودة بالفعل في المكتبة القياسية، لا حاجة لتثبيت إضافي.


2. الوحدات المخصصة

إنشاء وحدة بسيط — فقط اكتب ملف .py.

my_tools.py

PYTHON
# هذه وحدة مخصصة: my_tools.py

def greet(name):
    return f"Hello, {name}"

def add(a, b):
    return a + b

PI = 3.14159

main.py (استخدام الوحدة)

مثال: استيراد واستخدام وحدة مخصصة

PYTHON
# استيراد وحدة مخصصة
import my_tools

print(my_tools.greet("Zhang San"))   # Hello, Zhang San
print(my_tools.add(5, 3))            # 8
print(my_tools.PI)                   # 3.14159
▶ جرّب الكود
⚠️ يجب أن تكون ملفات الوحدات المخصصة في نفس الدليل كالملف الذي يستدعيها، أو في مسار بحث بايثون. الخطأ الأكثر شيوعاً للمبتدئين هو الحصول على "ModuleNotFoundError" عند استيراد وحداتهم الخاصة — تحقق من مسار الملف.


3. if __name__ == "__main__"

هذا نمط بايثون مهم جداً — يتيح للملف العمل كوحدة قابلة للاستيراد وكبرنامج نصي قابل للتشغيل المباشر:

مثال: نمط if name مزدوج الغرض

PYTHON
# calculator.py
def add(a, b):
    return a + b

def subtract(a, b):
    return a - b

# الكود أدناه يعمل فقط عندما يُنفّذ هذا الملف مباشرة
if __name__ == "__main__":
    print("Testing calculator functions:")
    print(f"3 + 5 = {add(3, 5)}")
    print(f"10 - 4 = {subtract(10, 4)}")
▶ جرّب الكود

عندما:

💡 كل ملف بايثون لديه متغير __name__. عند تشغيله مباشرة، يكون "__main__"؛ عند استيراده، يكون اسم الوحدة. هذه الميزة تتيح لنفس الملف أن يخدم أغراضاً مزدوجة كـ "مكتبة" و "برنامج نصي."


4. الحزم

عندما يكون لديك وحدات كثيرة، استخدم الحزم لتنظيمها — الحزمة هي دليل يحتوي على ملف __init__.py:

TEXT
my_package/
├── __init__.py      ← هذا الملف مطلوب (يمكن أن يكون فارغاً)
├── math_tools.py
└── string_tools.py
PYTHON
# math_tools.py
def multiply(a, b):
    return a * b

def divide(a, b):
    if b == 0:
        return "Cannot divide by zero"
    return a / b
PYTHON
# string_tools.py
def reverse(text):
    return text[::-1]

def count_vowels(text):
    vowels = "aeiouAEIOU"
    return sum(1 for c in text if c in vowels)

مثال: استخدام وحدات من حزمة

PYTHON
# استخدم الحزمة
from my_package import math_tools, string_tools

print(math_tools.multiply(3, 5))           # 15
print(string_tools.reverse("Python"))      # nohtyP
▶ جرّب الكود

5. مكتبات الطرف الثالث و pip

قوة بايثون تأتي إلى حد كبير من نظامها البيئي الغني لمكتبات الطرف الثالث. ثبّتها باستخدام pip:

BASH
pip install requests          # مكتبة طلبات HTTP
pip install numpy             # حساب عددي
pip install pandas            # تحليل بيانات
pip install flask             # إطار ويب

requirements.txt

عند مشاركة مشروعك مع الآخرين، تحتاج لإخبارهم بمكتبات الطرف الثالث المطلوبة. requirements.txt لهذا الغرض:

TXT
requests==2.31.0
numpy==1.24.0
pandas==2.0.0
flask==3.0.0

يمكن للمستلم تثبيت جميع التبعيات بأمر واحد:

BASH
pip install -r requirements.txt

إنشاء requirements.txt

BASH
pip freeze > requirements.txt
💡 اصطلاح المشروع: أي مشروع يستخدم مكتبات طرف ثالث يجب أن يحتوي على requirements.txt في الدليل الجذر. هذا اصطلاح أساسي لمشاريع بايثون. حتى لو تحديث إصدارات المكتبات، pip install -r requirements.txt سيثبّت الإصدارات الدقيقة التي استخدمتها، مما يضمن التوافق.


حالات الاستخدام الشائعة


❓ أسئلة شائعة

س ما الفرق بين import math و from math import pi؟
ج import math يستورد الوحدة بأكملها؛ يجب كتابة math.pi لاستخدامها. from math import pi يستورد فقط pi؛ يمكنك استخدام pi مباشرة. الأول أوضح (تعرف من أين أتى pi)؛ والثاني أكثر إيجازاً. لا يوجد معيار عالمي، لكن الاتساق داخل الملف موصى به. س:هل يجب أن يكون __init__.py فارغاً؟ ج:لا، لا يجب أن يكون فارغاً. __init__.py يُنفّذ عند استيراد الحزمة. يمكنك وضع كود تهيئة هناك — عرّف __all__ للتحكم في سلوك from package import *، أو حتى اكتب دوال مساعدة مباشرة فيه. في معظم المشاريع البسيطة، __init__.py فارغ بالفعل. س:أين يضع pip install المكتبات المثبتة؟ ج:افتراضياً، تذهب إلى دليل Lib/site-packages/ تحت تثبيت بايثون الخاص بك. إذا كان لديك مشاريع بمتطلبات تبعية مختلفة، استخدم البيئات الافتراضية (venv) — كل مشروع له دليل تبعيات خاص به، مما يبقيها معزولة. أنشئ واحدة بـ python -m venv myenv، فعّلها بـ source myenv/bin/activate.

📖 ملخص

  • ملف .py هو وحدة؛ استخدم import لاستخدامها
  • from module import name يستورد عناصر محددة فقط
  • if __name__ == "__main__" يتيح للملف أن يكون وحدة وبرنامجاً نصياً
  • الحزمة هي دليل به __init__.py لتنظيم وحدات متعددة
  • pip install package_name يثبّت مكتبات الطرف الثالث
  • requirements.txt يسجل تبعيات المشروع؛ pip install -r requirements.txt يثبّتها كلها مرة واحدة

📝 تمارين

  1. مبتدئ (الصعوبة ⭐): أنشئ وحدة geometry.py بدالتين: circle_area(radius) و rectangle_area(width, height). ثم استوردها واستخدمها في ملف آخر.

  2. متوسط (الصعوبة ⭐⭐): أضف كتلة if __name__ == "__main__" إلى geometry.py لاختبار دوالك. تحقق: التشغيل المباشر ينفذ الاختبارات؛ الاستيراد يتخطاها.

  3. متقدم (الصعوبة ⭐⭐⭐): أنشئ حزمة string_utils/ بوحدتين: validators.py (دوال التحقق: is_email(), is_phone()) و transformers.py (دوال التحويل: to_snake_case(), to_camel_case()). اكتب برنامجاً نصياً اختبارياً خارج الحزمة لاستيراد واستخدام هذه الميزات.

100%