كيفية استبعاد حقل 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
لتبسيط الأمور، فإن لديك خيارات عديدة للتأكد من أن كائناتك تتصرف بالطريقة الصحيحة. تعد هذه الطرق مفيدة لكل من يسعى لتحسين أدائه عند العمل على تطبيقات تتطلب إدارة الوقت والموارد بكفاءة.