2010-07-09 38 views
5

腌制(使用cPickle)已经暴露与Boost.Python的枚举可能吗?我已经用here描述的第一种方法成功地腌制了其他对象,但似乎没有一个适用于枚举类型,并且对象默认情况下似乎不可用。腌制Boost.Python公开的枚举

+0

+1我不知道如何做到这一点,但非常想! (目前我转换的枚举必须先腌到整数) – James 2010-07-31 13:29:25

回答

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() 

这会让一切咸菜就好了。

+1

我刚刚遇到了这个问题,在类范围内定义的枚举,为python 2.7.3。我手动添加:pickle(my_module.my_class.my_enum,reduce_enum),它工作。我删除了枚举类型的自动检测 - 顶层枚举的酸洗似乎已被修复。 – 2014-09-05 21:12:51

+0

很高兴知道。谢谢。我已经有好几年没有和英国石油一起工作过,所以我没有最新的。 – 2014-09-07 01:33:42