【问题标题】:Pickling an enum exposed by Boost.Python酸洗 Boost.Python 公开的枚举
【发布时间】:2010-07-09 17:12:40
【问题描述】:

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

【问题讨论】:

  • +1 我也不知道该怎么做,但非常愿意! (目前我将必须先腌制的枚举转换为整数)

标签: python pickle boost-python


【解决方案1】:

不像它们在模块中那样。我了解到这是可能的,但 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()

这会让所有的腌菜都很好。

【讨论】:

  • 我刚刚遇到了在类范围内定义的枚举的这个问题,对于 python 2.7.3。我手动添加了:pickle(my_module.my_class.my_enum, reduce_enum),它起作用了。我删除了枚举类型的自动检测 - 顶级枚举的酸洗似乎已得到修复。
  • 很高兴知道。谢谢。我已经好几年没在 BP 工作了,所以我没有了解最新情况。
猜你喜欢
  • 2018-10-25
  • 2014-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多