5

Boost.Python で公開された列挙型を (cPickle を使用して) ピクルすることは可能ですか? hereで説明されている最初の方法を使用して他のオブジェクトを正常にピクルしましたが、列挙型には適用されないようであり、オブジェクトはデフォルトでピクル可能ではないようです。

4

1 に答える 1

6

モジュールにあるものとは異なります。これが可能であると想定されていることを理解する必要がありますが、enum_ステートメントの動作方法がこれを防ぎます。

これは Python 側で回避できます。どこか (おそらく __init__.py ファイル内) で次のようにします。

import yourmodule

def isEnumType(o):
    return isinstance(o, type) and issubclass(o,int) and not (o is int)

def _tuple2enum(enum, value):
    enum = getattr(yourmodule, enum)
    e = enum.values.get(value,None)
    if e is None:
        e = enum(value)
    return e

def _registerEnumPicklers(): 
    from copy_reg import constructor, pickle
    def reduce_enum(e):
        enum = type(e).__name__.split('.')[-1]
        return ( _tuple2enum, ( enum, int(e) ) )
    constructor( _tuple2enum)
    for e in [ e for e in vars(yourmodule).itervalues() if isEnumType(e) ]:
        pickle(e, reduce_enum)

_registerEnumPicklers()

これにより、すべてがうまくピクルスになります。

于 2010-10-20T18:20:25.470 に答える