Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
pickle由Boost.Python公开的枚举_Python_Pickle_Boost Python - Fatal编程技术网

pickle由Boost.Python公开的枚举

pickle由Boost.Python公开的枚举,python,pickle,boost-python,Python,Pickle,Boost Python,是否可以(使用cPickle)pickle一个已经用Boost.Python公开的枚举?我已使用所述的第一种方法成功地pickle了其他对象,但这些方法似乎都不适用于枚举类型,并且这些对象在默认情况下似乎不可pickle。与模块中的对象不同。我知道这应该是可能的,但enum_u语句的工作方式阻止了这一点 您可以在python端解决这个问题。在某个地方(可能在一个_init__uu.py文件中)执行如下操作: import yourmodule def isEnumType(o): re

是否可以(使用cPickle)pickle一个已经用Boost.Python公开的枚举?我已使用所述的第一种方法成功地pickle了其他对象,但这些方法似乎都不适用于枚举类型,并且这些对象在默认情况下似乎不可pickle。

与模块中的对象不同。我知道这应该是可能的,但enum_u语句的工作方式阻止了这一点

您可以在python端解决这个问题。在某个地方(可能在一个_init__uu.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我也不知道怎么做,但我非常愿意!(在我将必须首先pickle的枚举转换为整数的那一刻)对于python 2.7.3类范围内定义的枚举,我刚刚遇到了这个问题。我手动添加了:pickle(my_module.my_class.my_enum,reduce_enum),它成功了。我删除了枚举类型的自动检测-顶级枚举的酸洗似乎已经修复。很高兴知道这一点。谢谢我已经好几年没有与英国石油公司合作了,所以我不了解最新情况。