شعار زيفيرنت

8 أدوات تزيين بايثون مدمجة لكتابة تعليمات برمجية أنيقة - KDnuggets

التاريخ:

8 أدوات تزيين بايثون مدمجة لكتابة تعليمات برمجية أنيقة
الصورة بواسطة المحرر
 

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

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

 

8 أدوات تزيين بايثون مدمجة لكتابة تعليمات برمجية أنيقة
الصورة بواسطة المحرر

@atexit.register يستخدم الديكور لتسجيل وظيفة ليتم تنفيذها عند إنهاء البرنامج. يمكن استخدام هذه الوظيفة لتنفيذ أي مهمة عندما يكون البرنامج على وشك الخروج، سواء كان ذلك بسبب التنفيذ العادي أو خطأ غير متوقع.

على سبيل المثال:

import atexit

# Register the exit_handler function
@atexit.register
def exit_handler():
    print("Exiting the program. Cleanup tasks can be performed here.")

# Rest of the program
def main():
    print("Inside the main function.")
    # Your program logic goes here.

if __name__ == "__main__":
    main()

الإخراج:

Inside the main function.
Exiting the program. Cleanup tasks can be performed here.

 

في التنفيذ أعلاه، @atexit.register مذكور أعلاه تعريف الوظيفة. فهو يحدد exit_handler() تعمل كوظيفة خروج. في الأساس، هذا يعني أنه كلما وصل البرنامج إلى نقطة الانتهاء، إما من خلال التنفيذ العادي أو بسبب خطأ غير متوقع تسبب في الخروج المبكر، exit_handler() سيتم استدعاء الوظيفة.

@dataclasses.dataclass هو مصمم ديكور قوي يُستخدم لإنشاء طرق خاصة شائعة تلقائيًا لفئات مثل "__init__" و"__repr__" وغيرها. يساعدك على كتابة تعليمات برمجية أكثر وضوحًا وإيجازًا عن طريق التخلص من الحاجة إلى كتابة أساليب معيارية لتهيئة مثيلات فصلك ومقارنتها. يمكن أن يساعد أيضًا في منع الأخطاء من خلال ضمان تنفيذ الأساليب الخاصة الشائعة بشكل متسق عبر قاعدة التعليمات البرمجية الخاصة بك.

على سبيل المثال:

from dataclasses import dataclass

@dataclass
class Point:
    x: int
    y: int


point = Point(x=3, y=2)
# Printing object
print(point)

# Checking for the equality of two objects
point1 = Point(x=1, y=2)
point2 = Point(x=1, y=2)
print(point1 == point2)

الإخراج:

Point(x=3, y=2)
True

 

@dataclass الديكور، المطبق فوق تعريف فئة النقطة، يشير إلى بايثون لاستخدام السلوك الافتراضي لإنشاء أساليب خاصة. يؤدي هذا تلقائيًا إلى إنشاء __init__ الطريقة، التي تقوم بتهيئة سمات الفئة، مثل x وy، عند إنشاء مثيل للكائن. ونتيجة لذلك، يمكن إنشاء مثيلات مثل النقطة دون الحاجة إلى ترميز صريح. وعلاوة على ذلك، فإن __repr__ يتم أيضًا ضبط الطريقة المسؤولة عن توفير تمثيل سلسلة للكائنات تلقائيًا. وهذا يضمن أنه عند طباعة كائن، مثل نقطة، فإنه ينتج تمثيلًا واضحًا ومنظمًا، كما هو موضح في الإخراج: Point(x=3, y=2). بالإضافة إلى ذلك، فإن مقارنة المساواة (==) بين مثيلين، point1 وpoint2، تنتج True. وهذا أمر جدير بالملاحظة لأنه افتراضيًا، تتحقق بايثون من المساواة بناءً على موقع الذاكرة. ومع ذلك، في سياق كائنات فئة البيانات، يتم تحديد المساواة من خلال البيانات الموجودة بداخلها. وذلك لأن مصمم @dataclass يقوم بإنشاء ملف __eq__ طريقة تتحقق من مساواة البيانات الموجودة في الكائنات، بدلاً من التحقق من نفس موقع الذاكرة.

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

على سبيل المثال:

from enum import Enum, unique

@unique
class VehicleType(Enum):
    CAR = 1
    TRUCK = 2
    MOTORCYCLE = 3
    BUS = 4

# Attempting to create an enumeration with a duplicate value will raise a ValueError
try:
    @unique
    class DuplicateVehicleType(Enum):
        CAR = 1
        TRUCK = 2
        MOTORCYCLE = 3
        # BUS and MOTORCYCLE have duplicate values
        BUS = 3
except ValueError as e:
    print(f"Error: {e}")

 

الإخراج:

Error: duplicate values found in : BUS -> MOTORCYCLE

 

في التنفيذ أعلاه، "BUS" و"MOTORCYCLE" لهما نفس القيمة "3". ونتيجة لذلك، @unique يُثير الديكور خطأ ValueError مع رسالة تشير إلى العثور على قيم مكررة. ولا يمكنك استخدام نفس المفتاح أكثر من مرة ولا يمكنك تعيين نفس القيمة لأعضاء مختلفين. بهذه الطريقة، يساعد على منع القيم المكررة لأعضاء التعداد المتعددين.

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

على سبيل المثال:

from functools import partial

# Original function
def power(base, exponent):
    return base ** exponent

# Creating a partial function with the exponent fixed to 2
square = partial(power, exponent=2)

# Using the partial function
result = square(3)
print("Output:",result)

 

الإخراج:

 

في التنفيذ أعلاه، لدينا دالة "قوة" تقبل وسيطتين "الأساس" و"الأس" وترجع نتيجة رفع الأساس إلى أس الأس. لقد أنشأنا دالة جزئية تسمى "مربع" باستخدام الدالة الأصلية التي تم فيها ضبط الأس مسبقًا على 2. وبهذه الطريقة، يمكننا توسيع وظائف الدوال الأصلية باستخدام partial مصمم.

@singledisptach يستخدم الديكور لإنشاء وظائف عامة. يسمح لك بتحديد تطبيقات مختلفة للوظائف بنفس الاسم ولكن أنواع وسائط مختلفة. يكون ذلك مفيدًا بشكل خاص عندما تريد أن تعمل التعليمات البرمجية الخاصة بك بشكل مختلف بالنسبة لأنواع البيانات المختلفة.

على سبيل المثال:

from functools import singledispatch

# Decorator
@singledispatch
def display_info(arg):
    print(f"Generic: {arg}")

# Registering specialized implementations for different types
@display_info.register(int)
def display_int(arg):
    print(f"Received an integer: {arg}")

@display_info.register(float)
def display_float(arg):
    print(f"Received a float: {arg}")

@display_info.register(str)
def display_str(arg):
    print(f"Received a string: {arg}")

@display_info.register(list)
def display_sequence(arg):
    print(f"Received a sequence: {arg}")

# Using the generic function with different types
display_info(39)             
display_info(3.19)          
display_info("Hello World!")
display_info([2, 4, 6])     

 

الإخراج:

Received an integer: 39
Received a float: 3.19
Received a string: Hello World!
Received a sequence: [2, 4, 6]

 

في التنفيذ أعلاه، قمنا أولاً بتطوير الوظيفة العامة display_info() يستخدم ال @singledisptach الديكور ثم سجل تنفيذه لـ int وfloat وstring وlist بشكل منفصل. يظهر الإخراج عمل display_info() لأنواع البيانات المنفصلة.

@classmethod هو مصمم يستخدم لتحديد أساليب الفصل داخل الفصل. ترتبط أساليب الفئة بالفئة بدلاً من كائن الفئة. يكمن الاختلاف الأساسي بين الأساليب الثابتة والأساليب الطبقية في تفاعلها مع حالة الفصل. تتمتع أساليب الفئة بإمكانية الوصول إلى حالة الفئة وتعديلها، في حين لا تستطيع الأساليب الثابتة الوصول إلى حالة الفئة والعمل بشكل مستقل.

على سبيل المثال:

class Student:
    total_students = 0

    def __init__(self, name, age):
        self.name = name
        self.age = age
        Student.total_students += 1

    @classmethod
    def increment_total_students(cls):
        cls.total_students += 1
        print(f"Class method called. Total students now: {cls.total_students}")

# Creating instances of the class
student1 = Student(name="Tom", age=20)
student2 = Student(name="Cruise", age=22)

# Calling the class method
Student.increment_total_students()  #Total students now: 3

# Accessing the class variable
print(f"Total students from student 1: {student1.total_students}")
print(f"Total students from student 2: {student2.total_students}")

 

الإخراج:

Class method called. Total students now: 3
Total students from student 1: 3
Total students from student 2: 3

 

في التنفيذ أعلاه، طالب الصف لديه Total_students كمتغير فئة. ال @classmethod يستخدم الديكور لتحديد increment_total_students() طريقة الطبقة لزيادة Total_students عامل. عندما نقوم بإنشاء مثيل لفئة الطالب، يتم زيادة العدد الإجمالي للطلاب بمقدار واحد. لقد أنشأنا مثيلين للفئة ثم استخدمنا طريقة الفئة لتعديل ملف Total_students متغير ل 3، وهو ما ينعكس أيضًا في مثيلات الفصل.

@staticmethod يستخدم الديكور لتحديد الأساليب الثابتة داخل الفصل. الأساليب الثابتة هي الأساليب التي يمكن استدعاؤها دون إنشاء مثيل للفئة. غالبًا ما تُستخدم الأساليب الثابتة عندما لا تحتاج إلى الوصول إلى المعلمات المتعلقة بالكائن وتكون أكثر ارتباطًا بالفئة ككل.

على سبيل المثال:

class MathOperations:
    @staticmethod
    def add(x, y):
        return x + y

    @staticmethod
    def subtract(x, y):
        return x - y

# Using the static methods without creating an instance of the class
sum_result = MathOperations.add(5, 4)
difference_result = MathOperations.subtract(8, 3)

print("Sum:", sum_result)            
print("Difference:", difference_result)

 

الإخراج:

Sum: 9
Difference: 5

 

في التنفيذ أعلاه، استخدمنا @staticmethod لتحديد طريقة ثابتة add() للفئة "MathOperations". لقد أضفنا الرقمين "4" و"5" لينتج عنهما "9" دون إنشاء أي مثيل للفئة. وبالمثل، اطرح الرقمين "8" و"3" لتحصل على "5". بهذه الطريقة يمكن إنشاء أساليب ثابتة لأداء وظائف الأداة المساعدة التي لا تتطلب حالة المثيل. 

@property يتم استخدام الديكور لتحديد أساليب getter لسمة الفئة. أساليب getter هي الأساليب التي تُرجع قيمة السمة. تُستخدم هذه الطرق لتغليف البيانات الذي يحدد من يمكنه الوصول إلى تفاصيل الفصل أو المثيل.

على سبيل المثال:

class Circle:
    def __init__(self, radius):
        self._radius = radius

    @property
    def radius(self):
        # Getter method for the radius.
        return self._radius

    @property
    def area(self):
        # Getter method for the area.
        return 3.14 * self._radius**2

# Creating an instance of the Circle class
my_circle = Circle(radius=5)

# Accessing properties using the @property decorator
print("Radius:", my_circle.radius)          
print("Area:", my_circle.area)  

 

الإخراج:

Radius: 5
Area: 78.5

 

في التنفيذ أعلاه، تحتوي فئة "الدائرة" على سمة "نصف القطر". وقد استخدمنا @property لإعداد طرق getter لنصف القطر وكذلك المنطقة. يوفر واجهة نظيفة ومتسقة لمستخدمي الفصل للوصول إلى هذه السمات. 

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

كانوال محرين مطور برامج طموح لديه اهتمام كبير بعلوم البيانات وتطبيقات الذكاء الاصطناعي في الطب. تم اختيار Kanwal باعتباره Google Generation Scholar 2022 لمنطقة APAC. يحب Kanwal مشاركة المعرفة التقنية من خلال كتابة مقالات حول الموضوعات الشائعة ، وهو متحمس لتحسين تمثيل المرأة في صناعة التكنولوجيا.

بقعة_صورة

أحدث المعلومات الاستخباراتية

بقعة_صورة