الوحدات Modules في لغة البرمجة python

تسمح الوحدات للمستخدم بتنظيم الشيفرة البرمجية كما أن تجميع الشيفرات المرتبطة مع بعضها يجعل من السهل فهم الشيفرة والتعامل معها.
الشيفرة تمثل غرضاً في لغة البرمجة python مع سمات تسمى اعتباطياً تمكن المستخدم من التصرف مع الوحدات.
بشكل بسيط فإن الوحدات عبارة عن ملف يحوي شيفرات برمجية ويمكنها تعريف التوابع والصفوف والمتحولات ويمكن أن تحوي شيفرات قابلة للتشغيل.

مثال

يوضح المثال التالي وحدة بسيطة وهو ملف من النوع python :

def print_func( par ):

print "Hello : ", par

return

التعليمة import

يمكن للمستخدم استخدام أي ملف مصدي كوحدة وذلك بتنفيذ التعليمة import في ملف آخر وهذه التعليمة لها الشيفرة البرمجية التالية:

import module1[, module2[,... moduleN]

عندما يقوم المترجم بتطبيق هذه التعليمة فإنه يجلبها من إذا كانت موجودة ضمن طريق البحث والذي هو قائمة من التوجيهات والتي يبحث عنها المترجم قبل جلب الوحدة.
مثال

#!/usr/bin/python

# Import module support
import support

# Now you can call defined function that module as follows
support.print_func("Zara")

فتظهر النتيجة التالية

Hello : Zara

يتم تحميل الوحدة لمرة واحدة فقط بغض النظر عن عدد مرات جلب هذه التعليمة.


التعليمة from…import

تسمح هذه التعليمة للمستخدم بجلب سمات خاصة من الوحدة إلى الفراغ الاسمي الحالي ولها الشيفرة البرمجية التالية

from modname import name1[, name2[, ... nameN]]

مثال

لجلب التابع Fibonacci من الوحدة fib يتم استخدام التعليمة التالية –

from fib import fibonacci

لا تجلب هذه التعليمة كامل الوحدة fib ضمن الفراغ الاسمي الحالي ولكنها تقدم التابع Fibonacci من الوحدة fib إلى جدول الرموز العام لجلب الوحدات.


التعليمة from…import*

من الممكن جلب كافة الأسماء من الوحدة إلى الفراغ الاسمي الحالي باستخدام التعليمة التالية:

from modname import *

وهي طريقة سهلة لجلب كل البنود من الوحدة إلى الفراغ الاسمي الحالي.


وحدات التموضع

عندما يقوم المستخدم بجلب الوحدة فإن المترجم يقوم بالبحث وفق التتالي التالي-

  • الاتجاه الحالي.
  • إذا كانت الوحدة غير موجودة يتم البحث في كل اتجاه ضمنه متغيرات ل Python .
  • إذا فشلت كل الخيارات فإن المترجم يتفحص طريق البحث الافتراضي.

المتحول PYTHONPATH

يعتبر هذا المتحول من متحولات البيئة ومكون من قائمة من التعليمات ولها الشيفرة البرمجية التالية:

set PYTHONPATH=c:\python20\lib;

وهناك صيغة معينة خاصة بنظام التشغيل UNIX

set PYTHONPATH=/usr/local/lib/python

فراغات الأسماء والفحص

تعتبر المتحولات معرفات ترسم مسار للأغراض وهي قاموس لأسماء المتحولات ولأغراضها التي تستجيب لها أي القيم.
يمكن للتعليمات أخذ المتحولات في الفراغات الاسمية الموضعية وفي الفراغات الاسمية العامة وإذا كان لهما السم نفسه فإن المتحول الموضعي يغطي على المتحول العام.
كل تابع يتميز بفراغ اسمي موضعي كما أن طرق الصف تتبع قاعدة الفحص نفسها كما في توابع الأوامر.
التعليمة العامة VarName تخبر لغة البرمجة python بأن ال VarName هو متحول عام وعليه توقف ال python البحث عن المتحول ضمن الفراغات الاسمية الموضعية.
مثال

#!/usr/bin/python

Money=2000
def AddMoney():
    # Uncomment the following line to fix the code:
    # global Money
Money = Money+1

print Money
AddMoney()
print Money

التابع dir()

يعتبر من التوابع المبنية في لغة البرمجة python ويعيد سلسلة مصنفة من السلاسل وتحوي الأسماء المعرفة ضمن الوحدة.
تحتوي هذه السلسلة على أسماء كل الوحدات والمتحولات والتوابع المعرفة في الوحدة.
مثال

#!/usr/bin/python

# Import built-in module math
import math
content =dir(math)
print content;

فتظهر النتيجة التالية

['__doc__','__file__','__name__','acos','asin','atan',
'atan2','ceil','cos','cosh','degrees','e','exp',
'fabs','floor','fmod','frexp','hypot','ldexp','log',
'log10','modf','pi','pow','radians','sin','sinh',
'sqrt','tan','tanh']

التوابع globals() و locals()

تستخدم هذه التوابع لإعادة الأسماء في الفراغات الاسمية الموضعية والعامة بالاعتماد على الموقع الذي تستدعى منه.
يستدعى التابع locals()من خلال التابع ويعيد كل الأسماء التي يتم الوصول إليها موضعياً من التابع .
يستدعى التابع globals() من خلال التابع ويعيد كل الأسماء التي يتم الوصول إليها بشكل عام من التابع.
وفي الحالتين فإن نموذج التابع هو قاموس ولذلك فإنه يمكن استدعاء الأسماء باستخدام التابع keys().


التابع reload()

عندما يتم استدعاء الوحدة إلى النص فإن الشيفرة البرمجية في الجزء العلوي من الوحدة تنفذ لمرة واحدة فقط لذلك يستخدم هذا التابع لإعادة تنفيذ الشيفرة البرمجية حيث يقوم هذا التابع باستدعاء الشيفرة مرو أخرى وله التركيبة البرمجية التالية:

reload(module_name)

في هذه التركيبة فإن اسم الوحدة هو للوحدة المراد إعادة تنفيذها وليس اسم السلسلة التي تتضمن الوحدة.
مثال

reload(hello)

مجموعة الحزم في بايثون

تعرف الحزمة على أنها ملف يحوي تعليمة عبارة عن تركيبة والتي تعرف بيئة لتطبيق مفرد يضم وحدات وحزم فرعية.
لنعتبر الملف Pots.py والمتوفر في تعليمة ال Phone حيث يحوي هذا الملف على السطر التالي من شيفرة المصدر-

#!/usr/bin/python

def Pots():
print"I'm Pots Phone"

وبشكل مشابه هناك ملفين لهما توابع مختلفة مع الاسم نفسه كما هو مبين آنفاً

  • Phone/Isdn.py وتابعها Isdn().
  • Phone/G3.py وتابعها G3().

ويمكن إنشاء ملف إضافي Phone/__init__.py
ولجعل كافة التوابع متوفرة عند استدعاء ال Phone يمكن استخدام التعليمات in __init__.py كالتالي-

from Pots import Pots
from Isdn import Isdn
from G3 import G3

وبعد إضافة هذه السطور إلى __init__.py يمكن استخدام كل الصفوف المتوفرة عند استدعاء حزمة ال phone

#!/usr/bin/python

# Now import your Phone Package.
import Phone

Phone.Pots()
Phone.Isdn()
Phone.G3()

فتظهر النتيجة التالية

I'm Pots Phone
I'm 3GPhone
I'm ISDN Phone

في المثال السابق تم أخذ مثال التوابع المفردة في كل ملف ولكن يمكن إبقاء التوابع المتعددة في الملف نفسه ويمكن أيضاً إيجاد صفوف مختلفة في هذه الملفات وعندها يمكن إنشاء الحزم الخاصة بالمستخدم خارج تلك الصفوف.