إعادة استخدام الكود بالاستيراد
الوحدة (module) ملف بايثون يمكن لكود آخر استخدام أسمائه (دوال وثوابت وأصناف). يحمّل import math الوحدة math من المكتبة القياسية ويجعلها متاحة بهذا الاسم: فتكتب math.sqrt(2). تأتي بايثون بمئات الوحدات، وما تثبّته لاحقًا (مثل numpy) يُستورد بالطريقة نفسها. ضع عمليات الاستيراد في أعلى الملف ليرى القارئ فورًا ما يعتمد عليه الملف.
import math
import statistics
# Use a name from a module with module.name
print(math.sqrt(252)) # 15.874507866387544
print(round(math.sqrt(252), 2)) # 15.87
returns = [0.01, -0.02, 0.015, 0.0]
print(round(statistics.stdev(returns), 4)) # 0.0155from ... import والأسماء المستعارة
تجلب from datetime import date اسمًا واحدًا فقط، فتكتب date(2025, 1, 2) بلا بادئة. ويعطي import numpy as np الوحدة اسمًا مستعارًا أقصر، وهو عُرف ستراه في كل مكان. تجنّب from module import * فهو يلقي أسماء مجهولة في ملفك وقد يستبدل أسماءك بصمت. فضّل الأسماء الواضحة، واستخدم البادئة حين تُظهر المصدر بجلاء.
from datetime import date
from math import sqrt as square_root
import statistics as stats
# Only the names you asked for are imported
start = date(2025, 1, 2)
end = date(2025, 3, 3)
print((end - start).days) # 60
print(square_root(16)) # 4.0
print(stats.mean([1.0, 2.0, 3.0])) # 2.0وحداتك الخاصة
أي ملف .py هو وحدة. فإذا كان fees.py بجانب main.py ويعرّف commission فيمكن لـmain.py أن يكتب import fees ويستدعي fees.commission(...). وعند تشغيل ملف مباشرةً تجعل بايثون __name__ فيه "__main__"، وعند استيراده يكون __name__ اسم الوحدة. لذلك فإن الحارس if __name__ == "__main__": يجعل الكود يعمل فقط عند تنفيذ الملف لا عند استيراده، فتبقى العروض والاختبارات بعيدة عن الطريق.
# fees.py
RATE = 0.001
def commission(notional):
return notional * RATE
if __name__ == "__main__":
print(commission(10000)) # runs only with: python fees.py
# main.py (next to fees.py)
import fees
print(fees.commission(50000)) # 50.0
print(__name__) # __main__أين تبحث بايثون، وفخ شائع
عند import name تبحث بايثون أولًا في مجلد السكربت الجاري تشغيله، ثم في المكتبة القياسية والحزم المثبّتة (القائمة هي sys.path). وتفوز أول مطابقة. ولهذا فإن ملفًا لك باسم random.py أو statistics.py يحجب الوحدة الحقيقية، فيحمّل import random ملفك ويفشل بطرق محيّرة. لا تسمِّ ملفاتك بأسماء وحدات المكتبة القياسية. وتجنّب أيضًا وحدتين تستورد كل منهما الأخرى في الأعلى (استيراد دائري)؛ انقل الجزء المشترك إلى وحدة ثالثة.
import sys
import random
# Imported modules are remembered in sys.modules; sys.path is the search list
print("random" in sys.modules) # True
print(random.__name__) # random
print(len(sys.path) > 0) # True
# A quick tour of useful standard-library modules
import collections, datetime, itertools, pathlib
print(collections.Counter("AAPL")["A"]) # 2
print(datetime.date(2025, 1, 2).weekday()) # 3 (Thursday; Monday is 0)datetime وstatistics وcsv وjson وcollections وitertools وpathlib). كود المكتبة المُختبَر أكثر أمانًا في الغالب من نسخة منزلية سريعة، ويعدّ المختبر التحليل اليدوي للتواريخ خطأً في الأسلوب.import moduleثمmodule.name؛ وfrom module import nameلاسم واحد؛ وimport module as shortلاسم مستعار.- تُوضع الاستيرادات في الأعلى؛ وتجنّب
import *. - لا تسمِّ ملفاتك بأسماء وحدات قياسية؛ واستخدم
if __name__ == "__main__":للكود الذي يجب أن يعمل مباشرةً فقط.
التالي: الحزم وتخطيط المشروع، كيف تنظّم عدة وحدات في مجلدات تُستورد بنظافة.
المختبر: ما الذي يُقيَّم
- قِس التقلب باستخدام
daily_vol25 نقطة - حوّل التقلب إلى سنة باستخدام
annualize_vol25 نقطة - عُدّ الأيام بين تاريخين باستخدام
days_between25 نقطة - ميّز أيام العمل من العطلات الأسبوعية باستخدام
is_business_day25 نقطة