2010-07-09 20 views
5

¿Es posible extraer (usando cPickle) una enumeración que ha sido expuesta con Boost.Python? He recogido con éxito otros objetos utilizando el primer método descrito here, pero nada de eso parece aplicarse a un tipo de enumeración, y los objetos no parecen ser elegibles por defecto.Decapado de una enumeración expuesta por Boost.Python

+0

+1 No sé cómo hacer esto tampoco, pero me gustaría mucho. (en el momento en que convierto las enumeraciones que deben ser escamadas en enteros primero) – James

Respuesta

6

No como están en el módulo. Se me ha dado a entender que se SUPONE QUE esto es posible, pero la forma en que funciona la enum_ declara esto.

Puede solucionar esto en el lado de python. En algún lugar (probablemente en un archivo __init__.py) hacer algo como esto:

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

Esto hará que todo salmuera muy bien.

+1

Acabo de encontrar este problema para las enumeraciones definidas dentro de un alcance de clase, para Python 2.7.3. Yo agregué manualmente: pickle (my_module.my_class.my_enum, reduce_enum), y funcionó. Eliminé la autodetección de tipos de enumeración: el decapado de enums de nivel superior parece haber sido reparado. –

+0

Eso es bueno saber. Gracias. No he trabajado con BP desde hace varios años, así que no estoy al tanto de lo último. –

Cuestiones relacionadas