7  الاستيراد والتصدير

عندما يكبر النص البرمجي المكتوب ويتعقد، فإننا كثيرًا ما نلجأ لتقسيمه في ملفات منفصلة وذلك ليكون كل ملف مسؤولاً عن جزئية معيَّنة.

أو قد نرى أن جزءًا من النص البرمجي يستحق الاستعمال في مشروع آخر، فنريد أن نلفَّه في حزمة، ونصدِّره ليكون قابلاً للتثبيت في مشاريع أخرى.

هاتان الحالتان تستوجبان أن نتعرف على مصطلحين في بايثون: الوحدة والحزمة.

الوِحدة (Module) هي النص البرمجي في الملف الواحد (مثل: script.py)

الحزمة (Package) هي مجموعة مكوَّنة من وِحدة أو أكثر؛ وتُعرَّف: بمجلَّد يكون فيه ملف خاص باسم __init.py__ ويوضع فيه النص البرمجي المنشئ الذي يعمل عند فعل استيراد الحزمة بالكلمة import (في المرة الأولى فقط).

فيما يلي مثال يوضِّح ترتيب حزمة ما (my_package) مكوَّنة من حزم مضمَّنة، وفي المستوى الأخير نرى الوحدات، على النحو التالي:

│───main.py
│
└───my_package
    │   __init__.py
    │
    ├───pkg1
    │   │   __init__.py
    │   │   module_a.py
    │   │   module_b.py
    │
    ├───pkg2
    │   │   __init__.py
    │   │   module_a.py
    │   │   module_b.py
    │   │   module_c.py

دعنا نلقي نظرة على عمليات الاستيراد واحدة تلو الأخرى، انظر (main.py):

import my_package
from my_package.pkg1 import module_a
from my_package.pkg2.module_a import func_a
from my_package.pkg2.module_b import *

أولاً، لاحظ أن فعل الاستيراد import my_package يحدد حزمة لا وحدة. وبالتالي، سينفذ الملف __init__.py، الذي يحتوي على عبارات تعيين (مثل __version__، وDEFAULT_TIMEOUT، وما إلى ذلك) سترتبط بمعرف my_package، ويمكن الوصول إليها باستخدام النقطة (.).

ثانيًا لاحظ العبارة: from my_package.pkg1 import module_a فهي تحدد وحدة (module_a)، وبالتالي، يتم تنفيذ جميع التعليمات البرمجية في module_a.py والتعيينات تُسنَد للمعرف module_a ويمكن الوصول إليها باستخدام النقطة (.).

ثالثًا استيراد مباشر للإجراء func_a من وحدة module_a في الحزمة الفرعية pkg2.

أخيرًا الصيغة from ... import * تستورد جميع (*) الأسماء من الوحدة النمطية (باستثناء تلك التي تبدأ بـ __) إلى نطاق التسمية الحالي (في الوحدة التي نحن فيها). بشكل عام، لا ننصح باستعمال هذه الطريقة، حيث قد تؤدي إلى إلغاء أسماء سبق تعريفها لتحل مكانها هذه الأسماء الجديدة، ولكن لا بأس بها لتقليل جهد الكتابةخصوصًا في الجلسات التفاعلية.

تثبيت حزم

لتثبيت حزمة من قاعدة بيانات الحزم PyPI نستعمل أداة uv على النحو التالي:

uv add pandas

وبعد تثبيت الحزمة ، نستوردها هكذا ونستعملها:

import pandas as pd

df = pd.read_csv('../../datasets/students.csv')
df
Name Age Grade Gender
0 Mohammed 19 88 M
1 Abdullah 20 95 M
2 Ahmed 21 87 M
3 Khalid 19 92 M
4 Sara 20 94 F
5 Fatima 22 89 F
6 Omar 21 91 M
7 Norah 20 93 F
8 Turki 19 86 M
9 Reem 21 90 F