شروحات الكمبيوتر والإنترنت والموبايل

كيفية استبعاد حقل attrs من deepcopy أو pickle في بايثون

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

أهمية استبعاد الخصائص من النسخ العميق

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

كيفية استخدام __deepcopy__()

أحد الطرق الشائعة لاستبعاد الخصائص هو إعادة تعريف طريقة __deepcopy__() داخل الفئة. لنأخذ مثالاً لشرح هذه العملية بشكل أفضل:

from copy import deepcopy
class ClassA(object):
    p_hidden = 1
    def __init__(self, value):
        self.p_shown = value
    def __deepcopy__(self, memodict={}):
        new_object = ClassA(deepcopy(self.p_shown, memodict))
        return new_object

في الكود السابق، قمنا بإنشاء فصل ClassA يحتوي على خاصيتين p_shown و p_hidden. نلاحظ أننا قُمنا باستبعاد الخاصية p_hidden عند إجراء عملية النسخ العميق.

استخدام __reduce__() لاستبعاد الخصائص

طريقة أخرى يمكن استخدامها هي إعادة تعريف __reduce__() والتي تسهل عملية التحميل باستخدام pickle. إذا كنت ترغب في تجاوز عملية النسخ العميق بالكامل، يمكنك استخدام كود مشابه:

class ClassA(object):
    p_hidden = 1
    def __init__(self, value):
        self.p_shown = value
    def __reduce__(self):
        return (self.__class__, (self.p_shown,))

فيما يضمن هذا الكود عدم نسخ الخصائص غير المرغوب فيها، مثل p_hidden.

تأثير استخدام مكتبة attrs

بالإضافة إلى الطرق السابقة، تعتبر مكتبة attrs من الأدوات المفيدة في بايثون لتبسيط تعريف الفئات. توفر المكتبة واجهات سهلة لتهيئة الخصائص، ولكن ماذا عن قابليتها لـ deepcopy؟

لمنع بعض الخصائص من أن تكون جزءًا من deepcopy عندما تعمل مع attrs، يمكنك استخدام الزخارف الخاصة بتعريف الحقول:

import attr
@attr.s
class ClassA:
    p_hidden = attr.ib(init=False, default=1)
    p_shown = attr.ib()
# الآن، عند نسخ الكائن، لن يتم نسخ p_hidden

الخلاصة

في النهاية، إدارة عمليات النسخ العميق أو الـ pickle في بايثون يمكن أن تكون تحديًا، خصوصًا عندما تحتاج لاستبعاد حقول معينة من عملية النسخ. سواء اخترت استخدام الطرق التقليدية مثل إعادة تعريف __deepcopy__() و __reduce__()، أو استخدام مكتبة attrs لتبسيط الأمور، فإن لديك خيارات عديدة للتأكد من أن كائناتك تتصرف بالطريقة الصحيحة. تعد هذه الطرق مفيدة لكل من يسعى لتحسين أدائه عند العمل على تطبيقات تتطلب إدارة الوقت والموارد بكفاءة.

فهد السلال

خبير تقني متخصص في شروحات الكمبيوتر والإنترنت والموبايل، يتمتع بخبرة واسعة في تقديم حلول تقنية مبتكرة ومبسطة. يهدف فهد إلى مساعدة المستخدمين على تحسين تجربتهم التقنية من خلال مقالات وأدلة عملية واضحة وسهلة الفهم.
زر الذهاب إلى الأعلى
Don`t copy text!