python 101 الوحدات (Modules) والحزم (Packages) في بايثون


عبدالهادي الديوري

python-modules-packages.png

الوحدات Modules

الوحدة مجموعة من شيفرات بايثون (دوال، أصناف…) يُمكن إعادة استخدامها من طرف المبرمج بسهولة، و يُمكن كذلك أن تسمى بالمكتبة.

يُمكن استيراد وحدة في برنامجك باستخدام كلمة import مع إلحاق اسم الوحدة. في المثال التالي نستورد وحدة time المُساعدة في التعامل مع الوقت في لغة بايثون، إذ توفّر دوالًا جاهزة تُمكننا من إجراء عدّة عمليات، كالحصول على الوقت الحالي، وكذلك التاريخ وغير ذلك.

 import time

بعد أن قمنا باستيراد وحدة الوقت، يُمكننا الآن الوصول إلى العديد من الدوال والمتغيرات المتواجدة بهذه الوحدة. 

يُمكننا مثلا الحصول على تاريخ اليوم والوقت باستدعاء الدالة asctime كالتالي:

>>> import time
>>> time.asctime()
'Fri Apr  8 19:47:35 2016'

يُمكننا كذلك الوصول إلى العديد من الدوال الأخرى المتعلّقة بالوقت، وهذه قائمة ببعض هذه الدوال: 

  • time: الحصول على عدد الثواني التي مرّت منذ يوم 1 يناير 1970، الذي يُسمى توقيت يونكس أو Unix Time.
>>> time.time()
1460139948.733128
  • sleep: الانتظار لعدد من الثواني قبل تنفيذ أمر معيّن. الأمر التالي سيوقف مُفسّر لغة بايثون عن العمل لخمس ثوان قبل استكمال العمل:
>>> time.sleep(5)

البرنامج التالي سيقوم بالانتظار لمدة ثانية واحدة قبل طباعة كلمة !Hello:

>>> time.sleep(1); print 'Hello!'

يُمكننا كذلك استيراد دالة واحدة أو مجموعة من الدوال فقط دون كامل الوحدة، وذلك باستخدام الجملة from import. مثلا يُمكننا استيراد الدالة asctime بمُفردها بالسّطر التالي:

from time import asctime

لاستدعاء أكثر من دالة، افصل بينها بفواصل.

from time import asctime, sleep

لاستعمال هذه الدوال المُستوردة يكفي استدعاؤها باسمها دون البادئة time.

>>> from time import asctime, sleep
>>> sleep(1)
>>> asctime()
'Fri Apr  8 19:49:25 2016'

الحصول على مساعدة حول الوحدة أو حول دالة من وحدة ما

يُمكنك استعمال سطر الأوامر للحصول على التوثيق الخاص بالوحدة الذي يشرح كل دالة على حدة بتنفيذ الأمر التالي من برنامج الطّرفيّة Terminal:

pydoc time

غيّر time باسم الوحدة التي ترغب بالحصول على توثيق لها. 

يُمكن كذلك استخدام الدالة help على بايثون مع تمرير اسم الوحدة أو الدالة التي ترغب في معرفة المزيد عنها:

help('time') # توثيق الوحدة time الكامل
help('time.sleep') # التوثيق الخاص بالدالة sleep

مُخرج السّطر الثاني:

Help on built-in function sleep in time:

time.sleep = sleep(...)
    sleep(seconds)

    Delay execution for a given number of seconds.  The argument may be
    a floating point number for subsecond precision.

إنشاء وحدة خاصة بك

أشرنا من قبل بأنّ الوحدة مُجرّد دوال ومتغيّرات، ما يعني بأنّك تستطيع تحويل أي ملف مكتوب بلغة بايثون إلى وحدة ما دام به دوال وأصناف.

سننشئ في هذا المثال وحدة لحساب مربّع عدد ومكعّبه، أي أنّ الوحدة ستحتوي على دالتين square لحساب مُربّع العدد، و cube لحساب مُكعّبه، أنشئ ملفا باسم num.py وضع به ما يلي:

mill = 1000000

def square(x):
    return x * x

def cube(x):
    return x * x * x

لقد أنشأت الآن وحدة يُمكن أن يستعملها غيرك من المُبرمجين. افتح مُفسّر بايثون واستورد الوحدة num وبعدها جرّب استعمال الدالتين على عدد معيّن:

>>> import num
>>> num.square(3)
9
>>> num.cube(3)
27
>>> num.mill
1000000

لاحظ بأنّنا استطعنا الوصول إلى قيمة المُتغيّر mill كذلك. 

يُمكن كذلك استدعاء دالة واحدة فقط:

>>> from num import cube
>>> cube(3)
27

توثيق الوحدة

يُمكنك توثيق الوحدة ليسهل على المبرمجين فهم الدوال ووظائفها، وذلك باستعمال سلسلة التوثيق Docstring تكون داخل ثلاث علامات تنصيص كالتّالي:

"""The num module provides utilties to work on numbers.
"""

mill = 1000000

def square(x):
    """Computes square of a number."""
    return x * x

def cube(x):
    """Computes cube of a number."""
    return x * x

إذا نفّذت الأمر pydoc على الوحدة، فستجد أن التوثيق قد أضيف تلقائيا.

Help on module num:

NAME
    num - The num module provides utilties to work on numbers.

FILE
    /home/dyouri/num.py

FUNCTIONS
    cube(x)
        Computes cube of a number.

    square(x)
        Computes square of a number.

DATA
    mill = 1000000

الوحدة OS

تُمكّن الوحدة os من إجراء عمليات نظام التّشغيل مثل إنشاء المجلّدات وعرض قائمة بالملفات المتواجدة بمجلّد معيّن، أو حتى حذف مُجلّد أو ملف بلغة بايثون.

عرض مسار مجلد العمل الحالي

يُمكنك أن تحصل على مسار المجلّد الحالي بالدّالة getcwd وهي اختصار لـ get current working direcrtory أي (احصل على مُجلّد العمل الحالي)، ويُمكن تنفيذ الدّالة كالتّالي:

>>> import os
>>> os.getcwd()
'/home/dyouri'

إذا كنت تستعمل مُفسّر بايثون في Windows، فالمُخرج سيكون مشابها لما يلي:

'C:\Python27'

إنشاء مجلد جديد

يُمكنك إنشاء مُجلّد بالدالة mkdir مع تمرير اسم المُجلّد كمُعامل:

>>> import os
>>> os.mkdir('New Folder')

بعد تنفيذ الأمر ستجد بأنّ المجلّد قد أضيف إلى قائمة المُجلّدات.

عرض مكونات مجلد معين

يُمكنك كذلك عرض مُكونات مُجلّد بالدّالة listdir وسيكون المخرج عبارة عن قائمة بأسماء الملفات والمجلّدات الموجودة في المسار المُمرّر للدالة. في هذه الحالة سنُمرّر مسار المُجلّد الحالي.

dir = os.getcwd()
os.listdir(dir)

يُمكنك عرض كل عنصر في سطر بحلقة for.

dir = os.getcwd()
list = os.listdir(dir)

for item in list:
    print item

إعادة تسمية ملف أو مجلد 

يُمكنك إعادة تسمية ملفّ أو مُجلّد بالدّالة rename كما يلي:

os.rename('Old', 'New')

حيث Old هو الاسم القديم، وNew هو الاسم الجديد.

حذف ملف

لحذف ملف يكفي استخدام الدالة remove، مع تمرير مسار الملف.

os.remove('file.txt')

حذف مجلد فارغ

يُمكن حذف مُجلّد فارغ بالدّالة rmdir مع تمرير مسار المجلّد المرغوب حذفه.

os.rmdir('New Folder')

إذا أردت أن تحذف مجلّدا يحتوي على ملفات فيمكن استخدام وحدة Shutil. (انظر القسم التالي).

تنفيذ أوامر النظام

أوامر النّظام هي الأوامر التي تستطيع تنفيذها من الطّرفيّة Terminal أو من برنامج Cmd على Windows. 

يُمكنك تنفيذ أوامر النّظام عبر الدالة system وذلك بتمرير الأمر كمُعامل.

os.system('ls')

الوحدة Shutil

تُمكّن الوحدة Shutil من إجراء عمليات على الملفات والمجلّدات، مثل نسخ ملف من مسار إلى مسار آخر أو نقله، أو حذف مُجلّد كامل.

حذف مجلد

كما أشرنا سابقا، تستطيع استخدام os.rmdir لحذف مُجلّد فارغ، لكن ماذا لو أردت حذف به ملفات؟ 

يُمكنك استخدام الدّالة rmtree من وحدة shutil للقيام بذلك.

import shutil
shutil.rmtree('Folder')

نسخ ملف

يُمكنك استخدام الدّالة copy لنسخ ملف من مسار إلى مسار آخر، الدالة تقبل مُعاملين، المُعامل الأول يُمثّل مسار الملف المراد نسخه، والمُعامل الثاني يُمثّل مسار الملفّ المراد النّسخ إليه.

shutil.copy('file.txt', 'Folder/file.txt')

نقل ملف

لنقل ملفّ يُمكن استخدام الدّالة move عوضا عن الدالة copy الخاصّة بالنّسخ.

shutil.move('file.txt', 'Folder/file.txt')

تمرير معاملات إلى ملف بايثون من الطرفية بالوحدة Sys

تُمكّننا الوحدة sys من تمرير مُعاملات عند تشغيل ملف مكتوب بلغة بايثون، فمثلا يُمكنك أن تكتب برنامجا للطّباعة دون الحاجة إلى الدّخول إلى مُفسّر بايثون. سيكون اسم الملف مثلا print.py وسنمكن من تمرير مُعامل له عند تشغيله كالتالي:

python print.py 'Hello World!'

يُمكن الحصول على المُعاملات الممرّرة على شكل قائمة، وهي مخزّنة في المُتغيّر argv من الوحدة sys

أنشئ ملفا باسم print.py وضع به ما يلي:

import sys
print sys.argv

إذا قُمت بتشغيل الملفّ مع تمرير معامل أو أكثر فستُطبع قائمة تحتوي على جميع هذه المُعاملات.

جرّب تنفيذ الملف مع تمرير كلمة hello كمُعامل.

python print.py hello

ستجد بأنّ المُخرج سيكون عبارة عن قائمة بعنصرين:

['print.py', 'hello']

العنصر الأول هو اسم الملفّ، والعنصر الثاني هو ما قُمنا بتمريره. 

يُمكنك بالطّبع الوصول إلى عنصر محدّد فقط بتحديد رقمه من القائمة:

import sys
print sys.argv[1]

في الشيفرة أعلاه، قمنا بطباعة العنصر الثاني. إذا كرّرت أمر التّشغيل السّابق ستُلاحظ بأنّ المُخرج هو كلمة hello فقط. 

لتمرير جملة، يكفي إحاطتها بعلامتي التّنصيص.

python print.py 'Hello World!'

الحزم Packages

الحزمة أو الرّزمة عبارة عن مُجلّد يحتوي على وحدة أو أكثر. 

عوضا عن ملفّ num.py يُمكن أن نقوم بوضع الملفات داخل مُجلّد الحزمة.

لإنشاء حزمة عليك إنشاء مُجلّد باسم الحزمة، التي سنُسميها num_package وداخل هذا المجلّد سنضع ملفيّن square .py و cube.py. كذلك يجب أن يحتوي المُجلّد على ملف باسم init__.py__ وذلك لإخبار بايثون بأنّ هذا المُجلّد عبارة عن حزمة.

لإنشاء المُجلّد والملفّات اللازمة، يُمكنك تنفيذ البرنامج التّالي:

import os

os.mkdir('num_package')

open('num_package/__init__.py', 'w').close()
open('num_package/square.py', 'w').close()
open('num_package/cube.py', 'w').close()

سنضع في ملفّ square.py الدالة الأولى:

def square(x):
    return x * x

وفي ملف cube.py الدالة الثانية:

def cube(x):
    return x * x * x

وسنترك الملفّ init__.py__ فارغا.

استيراد الحزمة

يُمكنك استيراد الحزمة كاملة كالتّالي:

import num_package

أو يُمكنك استيراد كل وحدة على حدة.

import num_package.square
import num_package.cube

بعد الاستيراد، يُمكن الوصول إلى الدوال كالتالي:

>>> num_package.square.square(3)
9
>>> num_package.cube.cube(3)
27

يُمكن كذلك وضع إختصار للوحدة وذلك لاختصار الوصول إلى الدوال، فقط ألحق سطر الاستيراد بكلمة as وبعدها أعطها اسما مُختصرا.

import num_package.square as sqr

ستستطيع الآن الوصول إلى الدالة بكتابة شيفرة أقل:

sqr.square(3)

يُمكن كذلك استخدام جملة from .. import.

from num_package.square import square as sqr
sqr(3)

تمارين

التمرين 1

استعمل وحدة time لإنشاء ساعة بسيطة تطبع الوقت الحالي كل ثانية.

التمرين 2

أنشئ المُجلدات التّالية (10 مُجلّدات) باستخدام لغة بايثون:

Folder1
Folder2
Folder3
.
.
Folder10

ملاحظة: استخدام حلقة تكرار لإنجاز الأمر.

التمرين 3

أعد تسمية المُجلّدات التي أنشأتها في التّمرين 2 بإضافة العدد واحد لنهاية كل مُجلّد، أي أنّ المُجلّد Folder1 يتغيّر اسمه إلى Folder2 وهكذا إلى أن تصل إلى المُجلّد العاشر Folder11.

التمرين 4

استعمل وحدة Sys لإنشاء آلة حاسبة بسيطة، يُمكن استخدامها كالتّالي:

python calc.py 3 + 4
=> 7

python calc.py 10 - 4
=> 6

ما التالي؟

وصلنا أخيرا إلى نهاية هذه السّلسلة التي تشرح أساسيات اللغة، فهنيئا لك على صبرك وهنيئا لك على إضافة لغة بايثون كمهارة أخرى إلى قائمة مهاراتك، ستتمكّن الآن من برمجة برامج ذات وظائف مُتعدّدة ومُعقّدة، وتستطيع قراءة وفهم بعض الشيفرات المُتواجدة على موقع Github.

إنّ ما يجعل بايثون لغة شهيرة هي مكتباتها التي تتعدّى الآلاف في شتى المجالات، لذا فالحديث عن لغة بايثون لا يمكن أن ينتهي هنا.

يُمكنك اختيار مكتبة أو إطار عمل لتعلّم تطوير الويب (Flask, Bottle, Django)، تطبيقات سطح المكتب (Python Qt, Python Gtk, TkInter, Kivy)، أو حتى مُعالجة الصّور بمكتبة OpenCV، وغيرها الكثير.

إذا كنت مُهتما بتطوير تطبيقات الويب فيُمكنك إلقاء نظرة على درس إنشاء موقع بسيط بإطار العمل Bottle

المصادر المعتمدة





تفاعل الأعضاء




يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن