2

私はpython 2.4で構築されたプロジェクトに取り組んでいます(これは組み込みのpythonプロジェクトであるため、使用するpythonのバージョンを選択できません)。アプリケーション全体で、array.arrayデータを保存するために使用します。

array.arrayオブジェクトの酸洗いのサポートは、2.5 でpickle(および) に追加されました。cPickle純粋な python pickle クラス (配列を処理するために Pickler/Unpickler をサブクラス化) を使用する場合、2.4 で実行可能な回避策がありますが、これは 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)
4

3 に答える 3

2

標準ライブラリ モジュールcopy_regを使用して関数を登録し、ピッキングをネイティブにサポートしていない型のピッキング インスタンスを処理できます。cPickle必要に応じて登録済みの関数を使用します。のインスタンスを酸洗いするという要件に、まさにこの「フック」アプローチを適用しますarray.array

于 2010-02-25T22:28:41.547 に答える
1

配列型をメソッド (おそらくサブクラス) で拡張できるかどうかはわかりません__reduce__が、いつでも配列をシーケンスに変換して元に戻すことができます...組み込みの拡張メカニズムが機能しない場合あなた。(ハック)

私はこれを試したことはありませんが、copy_regを介してサポートを追加することはできます...基本的に、独自のクラスまたはサブクラスに実装するのと同じ結果です__reduce__が、少しきれいです。

于 2010-02-25T22:26:28.133 に答える
1

それらをピクルスにできるように見えますが、結果をアンピクルすることはできません

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)

ダンプにはタイプコードに関する情報さえ含まれていないように見えます..またはデータさえも:(

>>> a=array.array('c','abcdefghijkl') 
>>> pickle.dumps(a,2)                                                                                                                                                                             
'\x80\x02carray\narray\nq\x01)\x81q\x02.'
>>> 
于 2010-02-25T22:34:14.007 に答える