سؤال

أنا أعمل على مشروع مبني على Python 2.4 (إنه مشروع Python مضمن ، لذلك ليس لدي خيار في إصدار Python المستخدم). طوال التطبيق ، نستخدم array.array لتخزين البيانات.

دعم التخليل array.array تمت إضافة الكائنات إلى picklecPickle) في 2.5. لدينا حل بديل قابل للتطبيق في 2.4 عند استخدام فئة Python Pickle النقية (نحن نخللي من الفئة الفرعية Pickler/Unpickler للتعامل مع المصفوفات) ولكن هذا لا يعمل مع CPickle (نحتاج إلى ذلك بسبب مشاكل الأداء).

أي اقتراحات؟

تحرير - الحل:

هذا هو الرمز النهائي الذي يبدو أنه يعمل (شكرًا على الاقتراحات):

# Add serialization for array objects
def array_unpickler(data):
    return array.array(data[0], data[1:])
def array_pickler(arr):
    return array_unpickler, ("%s%s" % (arr.typecode, arr.tostring()),)
copy_reg.pickle(array.ArrayType, array_pickler, array_unpickler)
هل كانت مفيدة؟

المحلول

يمكنك استخدام وحدة المكتبة القياسية copy_reg لتسجيل وظائف للتعامل مع مثيلات التخليل للأنواع التي لا تدعم المخلل ؛ cPickle سوف تستخدم وظائفك المسجلة عند الحاجة. سأطبق بالضبط هذا النهج "الخطاف" على متطلباتك من مثيلات التخليل array.array.

نصائح أخرى

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

لم أجرب هذا من قبل ، لكن يمكنك محاولة إضافة الدعم عبر copy_reg... في الأساس نفس نتيجة التنفيذ __reduce__ على صفك أو فئة فرعية ، ولكن منظف صبي.

يبدو أنك تستطيع المخلل لهم ، لكن لا يمكنك إلغاء تحديد النتيجة

Python 2.4.5 (#2, Jan 21 2010, 20:05:55) 
[GCC 4.2.4 (Ubuntu 4.2.4-1ubuntu3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import cPickle as pickle
>>> import array
>>> a=array.array('i','12345678')
>>> pickle.dumps(a,2)
'\x80\x02carray\narray\nq\x01)\x81q\x02.'
>>> b=pickle.loads(_)
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
TypeError: array() takes at least 1 argument (0 given)

يبدو أن مقالب القمامة لا تتضمن حتى معلومات حول typecode .. أو حتى البيانات :(

>>> a=array.array('c','abcdefghijkl') 
>>> pickle.dumps(a,2)                                                                                                                                                                             
'\x80\x02carray\narray\nq\x01)\x81q\x02.'
>>> 
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top