Python: كيفية استخدام dataclass وstruct لمحاكاة الهياكل (Structures) بكفاءة

1. ما هي الحاجة إلى الهياكل في Python؟

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

متى نشعر بالحاجة إلى الهياكل؟

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

2. محاكاة الهياكل باستخدام dataclass في Python

تم تقديم dataclass في Python 3.7 وهو أداة قوية لتعريف الأصناف بشكل مبسط والتعامل مع البيانات بطريقة تشبه الهياكل. توفر dataclass مرونة أكبر تتماشى مع طبيعة Python مقارنةً بالهياكل في لغة C.

الاستخدام الأساسي والأمثلة العملية لـ dataclass

يسمح dataclass بتعريف الهياكل البيانية ببساطة دون الحاجة إلى كتابة دوال يدوية. المثال التالي يوضح ذلك:
from dataclasses import dataclass

@dataclass
class Book:
    title: str
    author: str
    price: float
في هذا المثال، يتم تعريف صنف بيانات باسم Book. يتم تهيئة الحقول تلقائياً باستخدام الدالة __init__، مما يسهل إنشاء الكائنات.
book1 = Book("Python入門", "佐藤", 2800)
print(book1)  # الناتج: Book(title='Python入門', author='佐藤', price=2800)

الخصائص المتقدمة لـ dataclass

يمكنك أيضاً تحديد قيم افتراضية للحقول، مما يسهل التعامل مع الحقول الاختيارية:
@dataclass
class Product:
    name: str
    price: float = 0.0  # القيمة الافتراضية
بهذه الطريقة، يعد dataclass أداة قوية لإدارة البيانات البسيطة بطريقة واضحة وقابلة للقراءة.
RUNTEQ(ランテック)|超実戦型エンジニア育成スクール

3. استخدام وحدة struct في Python لمحاكاة الهياكل

توفر وحدة struct في Python طريقة مشابهة جداً للهياكل في لغة C، خصوصاً في التعامل مع ضغط وفك ضغط البيانات الثنائية، مما يجعلها مفيدة في اتصالات الشبكة ومعالجة الملفات.

الاستخدام الأساسي لوحدة struct

الكود التالي يوضح كيفية ضغط عدد صحيح وعدد عشري إلى سلسلة بايت ثم فكها:
import struct

# ضغط عدد صحيح وعدد عشري
packed_data = struct.pack('if', 1024, 3.14)
print(packed_data)

# فك ضغط البيانات
unpacked_data = struct.unpack('if', packed_data)
print(unpacked_data)
باستخدام struct، يمكن تحديد تنسيقات البيانات (مثل i للأعداد الصحيحة و f للأعداد العشرية) لإدارة البيانات بكفاءة.

التعامل مع أنواع بيانات أكثر تعقيداً

يمكن لـ struct التعامل مع عدة أنواع بيانات في آن واحد:
packed_data = struct.pack('i4sf', 1, b'test', 2.7)
print(packed_data)

unpacked_data = struct.unpack('i4sf', packed_data)
print(unpacked_data)

4. متى نستخدم dataclass ومتى نستخدم struct؟

لكل من dataclass وstruct خصائص مختلفة:

متى نستخدم dataclass؟

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

متى نستخدم struct؟

  • عند التعامل مع البيانات الثنائية: مثل اتصالات الشبكة أو ملفات ثنائية.
  • عند الحاجة إلى كفاءة عالية في استخدام الذاكرة: لإدارة بيانات ضخمة كسلاسل بايت.
侍エンジニア塾

5. أمثلة عملية على استخدام الهياكل

مثال dataclass: نظام إدارة بيانات المنتجات

from dataclasses import dataclass

@dataclass
class Product:
    name: str
    price: float
    stock: int

product1 = Product("كمبيوتر محمول", 150000, 30)
product2 = Product("هاتف ذكي", 80000, 50)

print(product1)

مثال struct: إرسال واستقبال البيانات الثنائية عبر الشبكة

import struct

data_to_send = struct.pack('i4sf', 42, b'data', 7.5)
print(data_to_send)

received_data = struct.unpack('i4sf', data_to_send)
print(received_data)

6. الخلاصة

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