腌制由Boost.Python暴露的枚举

时间:2010-07-09 17:12:41

标签: python pickle boost-python

是否可以使用Boost.Python来暴露(使用cPickle)枚举的枚举?我已经使用第一个描述here的方法成功地腌制了其他对象,但是这些方法似乎都不适用于枚举类型,并且默认情况下这些对象似乎不是pickleable。

1 个答案:

答案 0 :(得分: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()

这将使一切泡菜都很好。