جاري تحميل المحتوى...
عندما يكون البرنامج صغيرًا قد يكون من السهل وضع التعليمات وFunctions كلها في ملف Python واحد. لكن مع زيادة حجم البرنامج يصبح تنظيم الكود مهمًا. في هذا الفصل ستتعلم كيف تساعد Modules على تقسيم البرنامج إلى ملفات واضحة، وكيف تستخدم أدوات جاهزة تأتي مع Python ضمن Standard Library.
تساعد Modules على تنظيم البرنامج بدل وضع كل التعليمات في ملف واحد كبير.
من فوائدها:
فبدل وضع كل Functions داخل main.py يمكن نقل Functions المساعدة إلى ملف مثل helpers.py.
Module في هذا المستوى هو ملف Python يمكن أن يحتوي على Functions أو Variables أو تعليمات مرتبطة بموضوع معين.
مثلًا يمكن أن يحتوي الملف helpers.py على:
def greet(name):
return f"مرحبًا {name}"
يمكن بعد ذلك استخدام Function الموجودة في هذا الملف من ملف Python آخر.
لنفترض أن لدينا ملفين في المجلد نفسه داخل مشروع بسيط.
helpers.pydef greet(name):
return f"مرحبًا {name}"
main.pyimport helpers
message = helpers.greet("Ali")
print(message)
الناتج:
مرحبًا Ali
الملف helpers.py هو Local Module أنشأناه داخل المشروع، واستوردناه باستخدام الاسم helpers دون كتابة الامتداد .py داخل تعليمة import.
importتستخدم import لاستيراد Module.
import math
بعد استيراد math يمكن استخدام الأدوات الموجودة فيه عن طريق اسم Module.
import math
print(math.sqrt(25))
الناتج هو 5.0.
هنا:
math هو اسم Module.sqrt() أداة موجودة داخله.module.function()عندما نستخدم:
import math
نصل إلى Function باستخدام اسم Module أولًا:
math.sqrt(16)
والنمط العام هو:
module_name.function_name()
مثل:
import math
print(math.sqrt(16))
الناتج هو 4.0.
Modules لا تقتصر على Functions فقط، لكننا نركز هنا على الاستخدامات البسيطة المناسبة لهذا الفصل.
from ... importيمكن استيراد اسم محدد من Module بدل استخدام اسم Module في كل مرة.
from math import sqrt
print(sqrt(36))
الناتج هو 6.0.
لأننا استوردنا sqrt مباشرة، يمكن استدعاؤها باسمها دون كتابة math.sqrt().
| الصيغة | طريقة الاستخدام |
|---|---|
import math |
نستخدم مثلًا math.sqrt(25) |
from math import sqrt |
نستخدم مباشرة sqrt(25) |
كلتا الصيغتين صحيحتان، لكن طريقة الوصول إلى الاسم المستورد تختلف.
لن نستخدم import * في أمثلة هذا الفصل.
asيمكن استخدام Alias لتحديد اسم أقصر أو مختلف داخل الملف الحالي.
import math as m
print(m.sqrt(49))
الناتج هو 7.0.
الاسم m هو Alias نستخدمه داخل هذا الملف للإشارة إلى math.
Alias لا يغير الاسم الأصلي لـModule.
ويمكن أيضًا استخدام Alias مع اسم مستورد:
from math import sqrt as square_root
print(square_root(64))
الناتج هو 8.0.
Python Standard Library هي مجموعة من Modules تأتي مع Python وتوفر أدوات جاهزة لمهام كثيرة.
سنستخدم في هذا الفصل أربعة Modules فقط:
mathrandomdatetimepathlibلا تحتاج هذه Modules في أمثلة الفصل إلى تثبيت مكتبات خارجية.
mathيوفر math أدوات حسابية جاهزة.
math.sqrt()import math
print(math.sqrt(81))
الناتج هو 9.0.
math.ceil()import math
print(math.ceil(4.2))
الناتج هو 5.
math.floor()import math
print(math.floor(4.8))
الناتج هو 4.
math.piيوفر Module أيضًا القيمة math.pi.
import math
print(math.pi)
لا نحتاج في هذا الفصل إلى Trigonometry أو Logarithms متقدمة.
randomيوفر random أدوات لاختيار قيم عشوائية.
random.randint()import random
number = random.randint(1, 6)
print(number)
القيمة الناتجة هي عدد صحيح بين 1 و6 شاملًا.
لا يمكن تحديد رقم واحد ثابت بوصفه الناتج المتوقع من هذا الكود؛ فالنتيجة عشوائية.
random.choice()import random
names = ["Ali", "Sara", "Omar"]
name = random.choice(names)
print(name)
القيمة الناتجة ستكون عنصرًا من List names، لكن لا نحدد مسبقًا أي اسم بعينه.
لن نستخدم random.seed() في هذا الفصل.
datetimeيوفر datetime أدوات للتعامل مع التواريخ والأوقات.
سنستخدم تواريخ ثابتة حتى تكون الأمثلة واضحة ويمكن التحقق من نتائجها.
import datetime
date_value = datetime.date(2026, 8, 12)
print(date_value.year)
print(date_value.month)
print(date_value.day)
الناتج:
2026
8
12
يمكن أيضًا استيراد date مباشرة:
from datetime import date
birthday = date(2000, 5, 10)
print(birthday.month)
الناتج هو 5.
يوجد أيضًا date.today() للحصول على تاريخ اليوم، لكننا لا نعتمد عليه في أسئلة النتائج لأن القيمة تتغير مع الوقت.
pathlibيوفر pathlib طريقة منظمة للتعامل مع Paths.
سنستخدم الأداة Path بصورة تمهيدية.
from pathlib import Path
path = Path("notes.txt")
print(path.name)
الناتج هو:
notes.txt
ويمكن الحصول على امتداد الملف باستخدام .suffix:
from pathlib import Path
path = Path("report.txt")
print(path.suffix)
الناتج هو:
.txt
يمكن كذلك بناء Path بصورة منظمة:
from pathlib import Path
path = Path("data") / "notes.txt"
لكننا لا نعتمد في الاختبار على الشكل النصي النهائي للمسار، لأن فواصل المسارات قد تختلف بين أنظمة التشغيل.
| النوع | المعنى | مثال |
|---|---|---|
| Local Module | ملف Python أنشأه المبرمج داخل المشروع. | helpers.py |
| Standard Library Module | Module تأتي مع Python وتوفر أدوات جاهزة. | math |
في المثال البسيط:
import helpers
import math
helpers يمكن أن يكون Local Module داخل المشروع، بينما math جزء من Standard Library.
لن نتناول Third-party packages في هذا الفصل.
__name__ بصورة تمهيديةتعطي Python لكل Module متغيرًا خاصًا باسم __name__.
عندما نشغل ملف Python مباشرة في الحالة الأساسية التي ندرسها، تكون قيمة __name__ هي "__main__".
أما عندما يستورد ملف Module آخر، فتكون قيمة __name__ عادة اسم ذلك Module في الحالة البسيطة.
if __name__ == "__main__":يمكن استخدام الشرط التالي للفصل بين التعريفات التي يمكن استيرادها والكود الذي نريد تشغيله عند تشغيل الملف مباشرة.
def greet(name):
return f"مرحبًا {name}"
if __name__ == "__main__":
print(greet("Ali"))
إذا شغلنا هذا الملف مباشرة، يتحقق الشرط في الحالة الأساسية ويظهر:
مرحبًا Ali
وتظل Function greet() قابلة للاستيراد من ملف آخر.
لن ندخل هنا في تفاصيل Import Machinery أو طرق تشغيل Packages.
يجب كتابة اسم Module بصورة صحيحة.
مثلًا إذا لم يوجد Module باسم helperz وحاولنا:
import helperz
فقد تظهر ModuleNotFoundError.
يكفي في هذا الفصل أن نعرف أن اسم Module ومساره البسيط يجب أن يكونا صحيحين. التفاصيل المتقدمة لنظام الاستيراد ليست ضمن النطاق.
importإذا كان الملف اسمه helpers.py فإن الصيغة البسيطة هي:
import helpers
وليس import helpers.py.
import moduleبعد:
import math
نستخدم مثلًا math.sqrt(25)، وليس sqrt(25) مباشرة ما لم نستورد sqrt نفسها.
import math تختلف في طريقة الاستخدام عن from math import sqrt.
import math as m يجعلنا نستخدم m داخل الملف الحالي، لكنه لا يعيد تسمية math نفسها.
randomلا تتوقع أن تعيد random.randint(1, 6) رقمًا محددًا في كل تشغيل.
date.today() تتغير نتيجتها بمرور الأيام، لذلك نستخدم تواريخ ثابتة في أسئلة تتبع النتائج.
عند استخدام pathlib نفضل في هذا الفصل خصائص مستقرة مثل .name و.suffix بدل اختبار شكل الفاصل بين المجلدات.
أنشئ ملفًا باسم helpers.py يحتوي Function تعيد ضعف عدد، ثم استوردها من main.py باستخدام import helpers.
استخدم import math واحسب الجذر التربيعي للقيمة 64.
أعد المثال السابق باستخدام from math import sqrt.
استخدم Alias لـmath باسم m ثم استدعِ m.ceil(3.2).
استخدم random.randint(1, 10) وحدد فقط النطاق الممكن للنتيجة، دون افتراض رقم معين.
أنشئ تاريخًا ثابتًا باستخدام datetime.date() ثم اطبع year وmonth وday.
أنشئ Path("report.txt") واعرض .name و.suffix.
أنشئ Function في ملف مستقل، ثم أضف مثالًا قصيرًا يستخدم if __name__ == "__main__": عند تشغيل الملف مباشرة.
helpers.py يمكن أن يكون Local Module.helpers.py باستخدام import helpers دون كتابة .py.import math يجعلنا نستخدم مثلًا math.sqrt().from math import sqrt يسمح باستخدام sqrt() مباشرة.as تستخدم لإنشاء Alias داخل الملف الحالي.math يوفر أدوات مثل sqrt() وceil() وfloor() وpi.random.randint(a, b) تعيد عددًا صحيحًا ضمن النطاق الشامل المحدد، ولا نعرف النتيجة الدقيقة مسبقًا.random.choice() تختار عنصرًا من Sequence مثل List.datetime يمكن استخدامه لإنشاء تواريخ ثابتة وقراءة year وmonth وday.Path من pathlib تساعد على التعامل مع Paths بصورة منظمة..name تعيد اسم العنصر الأخير في Path، و.suffix تعيد امتداد الملف في الأمثلة المستخدمة.__name__ هي "__main__" في الحالة الأساسية.if __name__ == "__main__": للكود المخصص للتنفيذ عند تشغيل الملف مباشرة.في الفصل التالي ستتعلم الحزم وpip وvenv، وكيفية إدارة الأدوات الخارجية وبيئات المشروع. لن نتناول هذه المفاهيم داخل هذا الفصل.
نشر في ١١ أغسطس ٢٠٢٦