كيفية كتابة وحدة مخصصة في بايثون

هل تتساءل كيف يمكنك كتابة وحدة بايثون خاصة بك، على غرار مكتبات بايثون الشهيرة مثل NumPy أو Pandas؟

في هذه المقالة، نستكشف ما هي وحدة بايثون المخصصة، وكيفية كتابة وحدة في بايثون. دعونا ندخل في هذا الأمر.

ما هي الوحدة المخصصة في بايثون؟

الوحدة هي ملف برنامج بايثون يتكون من تعريفات أو تعليمات برمجية يمكنك الاستفادة منها في ملفات برنامج بايثون الأخرى. إنها ملفات .py المكتوبة بلغة بايثون.

يمكنك كتابة وحدة بايثون بنفسك. يمكن أن تحتوي على تعريفات للدالة والفئات والمتغيرات التي يمكن استخدامها في برامج بايثون الأخرى.

لماذا أكتب وحدة مخصصة في بايثون؟

تعد كتابة الوحدات المخصصة في لغة بايثون مفيدة لتقسيم أجزاء كبيرة من البرنامج إلى ملفات أصغر وأكثر تنظيمًا وأكثر قابلية للإدارة. كما أنه يزيد من إمكانية إعادة استخدام الكود وهو تطبيق ممتاز لمبدأ DRY (لا تكرر نفسك).

على سبيل المثال، بدلًا من نسخ ولصق الدوال التي نستخدمها في برامج مختلفة مرارًا وتكرارًا، يمكننا تخزينها في وحدة بايثون المخصصة واستيرادها حسب الحاجة.

كيفية كتابة وحدة مخصصة في بايثون

لنقم بتشغيل مثال سريع عن طريق كتابة وحدة تسمى Circle_area. يتم حفظه كـ circle_area.py ويحتوي على دالة لحساب مساحة الدائرة:

# circle_area.py
# Define a function
def area_of_circle(r):
    pi = 3.14
    area = pi * (r * r)
    return area

بعد ذلك، نفتح ملفًا آخر يسمى main.py حيث نقوم بتشغيل دالتنا:

# main.py
# Import the circle_area module
import circle_area
 
# Call the function
print("Area of circle = %.6f" % circle_area.area_of_circle(7))

نظرًا لأننا نشير إلى الوحدة، نحتاج إلى استدعاء الدالة عن طريق الإشارة إلى اسم الوحدة بالترميز النقطي. لمزيد من المعلومات، يمكنك الاطلاع على مقالة حول دوال PYTHON.

عندما نقوم بتشغيل البرنامج النصي main.py في الطرفية، نحصل على النتيجة التالية:

Area of circle = 153.860000

لقد قمنا باستيراد الوحدة بأكملها في المثال أعلاه. وبدلاً من ذلك، كان بإمكاننا استيراد الدوال اللازمة لبرنامجنا فقط. في هذه الحالة، سنقوم فقط باستيراد التابع Area_of_circle()‎ على النحو التالي:

from circle_area import area_of_circle

يمكننا أيضًا استيراد الوحدة عن طريق إعادة تسميتها:

import circle_area as ca

يمكن أن توفر هذه الطريقة الوقت. و غالبًا ما تصبح الاختصارات ممارسة قياسية في الصناعة؛ على سبيل المثال، غالبًا ما يتم استيراد مكتبة NumPy بتنسيق np.

يمكننا أيضًا استيراد جميع التعريفات من وحدة بإستخدام رمز النجمة (*)، كما يلي:

from circle_area import *

ومع ذلك، فهي ليست ممارسة برمجة جيدة، لأنها يمكن أن تؤدي إلى تعريفات مكررة وتجعل التعليمات البرمجية أقل قابلية للقراءة.

⚠️لماذا يجب عليك تجنب استيراد* في بايثون 🐍

يمكننا أيضًا تعريف المتغيرات داخل الوحدة واستدعاءها من البرنامج النصي الرئيسي لدينا. على سبيل المثال، قمت بتحديث الوحدة Circle_area.py السابقة عن طريق إضافة متغير يسمى Coolpy:

# circle_area.py
# Define a function
def area_of_circle(r):
    pi = 3.14
    area = pi * (r * r)
    return area
 
# Define a variable
coolpy = "pyarabic.com/ is cool!"

ثم نقوم بطباعته من ملف main.py الخاص بنا:

# Import the circle_area module
import circle_area
 
# Call the function
print("Area of circle = %.6f" % circle_area.area_of_circle(7))
 
# Print the variable
print(circle_area.coolpy)

وهذا يعطينا الناتج التالي:

Area of circle = 153.860000
pyarabic.com/ is cool!

يمكننا أيضًا إضافة فئات إلى وحدة بايثون المخصصة لدينا. من أجل الوضوح، قمت بإنشاء وحدة جديدة محفوظة باسم pypok.py، و التي استخدمتها سابقًا:

# pypok.py
# Define a class
class Pokemon:
    def __init__(self, power, level, names):
        self.power = power
        self.level = level
        self.names = names
 
    def __repr__(self):
        return (f'Pokemon({self.power}, '
                f'{self.level}, '
                f'{self.names})')
 
    def total_damage(self):
        return self.damage(self.power, self.level)
 
    @staticmethod
    def damage(power, level):
        return (power * level * 2) / 50

نضيف الآن الفئة إلى main.py. لكي يعمل البرنامج النصي بدون أخطاء، أحتاج إلى استيراد وحدة pypok الجديدة.

# main.py
# Import the circle_area and pypok modules
import circle_area
import pypok
 
# Call the function
print("Area of circle = %.6f" % circle_area.area_of_circle(7))
 
# Print the variable
print(circle_area.coolpy)
 
# Call the class
squirtle = pypok.Pokemon(20, 8, "Squirtle")
print("Squirtle inflicts", squirtle.total_damage(), "points of damage!")

يؤدي تشغيل البرنامج النصي main.py إلى إرجاع المخرجات التالية:

Area of circle = 153.860000
pyarabic.com/ is cool!
Squirtle inflicts 6.4 points of damage!

بمجرد استدعاء الفئة المخصصة المحددة مسبقًا، يمكننا الوصول إلى دوال وتوابع الفئة داخل مساحة اسم الملف main.py.

بينما يمكننا كتابة وحدات مخصصة لتحديد الدوال، يمكننا أيضًا كتابتها لتنفيذ التعليمات البرمجية.

# circle_area.py
# Define a function
def area_of_circle(r):
    pi = 3.14
    area = pi * (r * r)
    return area
 
# Call the function inside the module
print(area_of_circle(7))

نقوم بتحديث البرنامج النصي main.py عن طريق حذف كل شيء باستثناء سطر استيراد الوحدة:

# main.py
# Import the circle_area module
import circle_area

الآن يمكننا تشغيل البرنامج النصي والحصول على الإخراج التالي:

153.86

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

من الأفضل إبقاء الوحدات عامة قدر الإمكان لجعلها قابلة لإعادة الاستخدام ولتجنب التكرار. يجب الاحتفاظ بالمتغيرات الخاصة بالمشروع في الملف العام، مثل main.py.

كتابة وحدات مخصصة في بايثون!

آمل أن يكون هذا المقال قد أعطاك فهمًا جيدًا لكيفية كتابة وحدة في بايثون. لا تتردد في اللعب بالمقتطفات أعلاه وكتابة الوحدات الخاصة بك.

كما أنني أشجعك على التفكير في ممارساتك البرمجية. ما هي الدوال أو الفئات التي تستخدمها بشكل متكرر؟ قد يكون من الممارسات الجيدة تخزينها في وحدة بايثون المخصصة الخاصة بك لتوفير الوقت وجعل التعليمات البرمجية أكثر قابلية للقراءة وأسهل للصيانة.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

اكتشاف المزيد من بايثون العربي

اشترك الآن للاستمرار في القراءة والحصول على حق الوصول إلى الأرشيف الكامل.

Continue reading

Scroll to Top