Array.array في 2.4 باستخدام CPickle
-
22-09-2019 - |
سؤال
أنا أعمل على مشروع مبني على Python 2.4 (إنه مشروع Python مضمن ، لذلك ليس لدي خيار في إصدار Python المستخدم). طوال التطبيق ، نستخدم array.array
لتخزين البيانات.
دعم التخليل array.array
تمت إضافة الكائنات إلى pickle
(و cPickle
) في 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.'
>>>