Очищение перечисления Boost.Python - PullRequest
5 голосов
/ 09 июля 2010

Можно ли выбрать (используя cPickle) перечисление, открытое с помощью Boost.Python?Я успешно выбрал другие объекты, используя первый метод, описанный здесь , но, по-видимому, ничего из этого не применимо к типу enum, и объекты по умолчанию не могут быть выбраны.

1 Ответ

6 голосов
/ 20 октября 2010

Не так, как в модуле. Мне дают понять, что это ПРЕДПОЛАГАЕТСЯ, чтобы быть возможным, но способ, которым работает оператор enum_, предотвращает это.

Вы можете обойти это на стороне питона. Где-то (вероятно, в файле __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()

Это заставит все мариноваться просто отлично.

...