الوحدات والحزم
مع نمو كودك، يصبح وضع كل شيء في ملف واحد غير حكيم. الوحدات تتيح لك تقسيم الكود إلى ملفات متعددة؛ الحزم تتيح لك تنظيم الوحدات ذات الصلة معاً. تعلم البرمجة المعيارية هو عتبة "الهندسة" الحقيقية.
1. ما هي الوحدة
في بايثون، ملف .py هو وحدة. يمكنك استخدام import لجلب الوظائف من وحدات أخرى:
مثال: استيراد وحدات المكتبة القياسية
# استيراد وحدة كاملة
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
# هذه وحدة مخصصة: my_tools.py
def greet(name):
return f"Hello, {name}"
def add(a, b):
return a + b
PI = 3.14159
main.py (استخدام الوحدة)
مثال: استيراد واستخدام وحدة مخصصة
# استيراد وحدة مخصصة
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
3. if __name__ == "__main__"
هذا نمط بايثون مهم جداً — يتيح للملف العمل كوحدة قابلة للاستيراد وكبرنامج نصي قابل للتشغيل المباشر:
مثال: نمط if name مزدوج الغرض
# 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)}")
عندما:
python calculator.py← كود الاختبار يعمل (__name__ == "__main__"هو True)import calculatorفي ملف آخر ← كود الاختبار لا يعمل (__name__هو"calculator")
__name__. عند تشغيله مباشرة، يكون "__main__"؛ عند استيراده، يكون اسم الوحدة. هذه الميزة تتيح لنفس الملف أن يخدم أغراضاً مزدوجة كـ "مكتبة" و "برنامج نصي."
4. الحزم
عندما يكون لديك وحدات كثيرة، استخدم الحزم لتنظيمها — الحزمة هي دليل يحتوي على ملف __init__.py:
my_package/
├── __init__.py ← هذا الملف مطلوب (يمكن أن يكون فارغاً)
├── math_tools.py
└── string_tools.py
# 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
# 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)
مثال: استخدام وحدات من حزمة
# استخدم الحزمة
from my_package import math_tools, string_tools
print(math_tools.multiply(3, 5)) # 15
print(string_tools.reverse("Python")) # nohtyP
5. مكتبات الطرف الثالث و pip
قوة بايثون تأتي إلى حد كبير من نظامها البيئي الغني لمكتبات الطرف الثالث. ثبّتها باستخدام pip:
pip install requests # مكتبة طلبات HTTP
pip install numpy # حساب عددي
pip install pandas # تحليل بيانات
pip install flask # إطار ويب
requirements.txt
عند مشاركة مشروعك مع الآخرين، تحتاج لإخبارهم بمكتبات الطرف الثالث المطلوبة. requirements.txt لهذا الغرض:
requests==2.31.0
numpy==1.24.0
pandas==2.0.0
flask==3.0.0
يمكن للمستلم تثبيت جميع التبعيات بأمر واحد:
pip install -r requirements.txt
إنشاء requirements.txt
pip freeze > requirements.txt
requirements.txt في الدليل الجذر. هذا اصطلاح أساسي لمشاريع بايثون. حتى لو تحديث إصدارات المكتبات، pip install -r requirements.txt سيثبّت الإصدارات الدقيقة التي استخدمتها، مما يضمن التوافق.
حالات الاستخدام الشائعة
- إعادة استخدام الكود: استخرج دوال المساعدة إلى وحدات منفصلة، مشتركة عبر مشاريع متعددة.
- تنظيم المشروع: استخدم الحزم للتنظيم حسب الوظيفة (مثل
models/,utils/,views/). - إدارة التبعيات: استخدم
requirements.txtلإدارة إصدارات مكتبات الطرف الثالث. - البرامج النصية مزدوجة الغرض: استخدم
if __name__ == "__main__"حتى يمكن استيراد الملف وتشغيله مباشرة.
❓ أسئلة شائعة
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يثبّتها كلها مرة واحدة
📝 تمارين
-
مبتدئ (الصعوبة ⭐): أنشئ وحدة
geometry.pyبدالتين:circle_area(radius)وrectangle_area(width, height). ثم استوردها واستخدمها في ملف آخر. -
متوسط (الصعوبة ⭐⭐): أضف كتلة
if __name__ == "__main__"إلىgeometry.pyلاختبار دوالك. تحقق: التشغيل المباشر ينفذ الاختبارات؛ الاستيراد يتخطاها. -
متقدم (الصعوبة ⭐⭐⭐): أنشئ حزمة
string_utils/بوحدتين:validators.py(دوال التحقق:is_email(),is_phone()) وtransformers.py(دوال التحويل:to_snake_case(),to_camel_case()). اكتب برنامجاً نصياً اختبارياً خارج الحزمة لاستيراد واستخدام هذه الميزات.



