2010-07-09 20 views
5

E 'possibile mettere sottaceto (usando cPickle) un enum che è stato esposto con Boost.Python? Ho in salamoia con successo altri oggetti utilizzando il primo metodo descritto here, ma niente di tutto ciò sembra richiedere un tipo enum, e gli oggetti non sembrano essere pickleable per impostazione predefinita.Pickling un enum esposto da Boost.Python

+0

+1 non riesco a capire come fare questa operazione, ma sarebbe molto simile a! (al momento converto enummi che devono essere decodificati in numeri interi) – James

risposta

6

non come sono nel modulo. Mi è stato dato di capire che questo è SUPPORTO possibile, ma il modo in cui funziona enum_ impedisce questo.

È possibile aggirare il problema dal lato del pitone. Da qualche parte (probabilmente in un file __init__.py) fare qualcosa di simile:

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

Questo renderà tutto salamoia bene.

+1

Ho appena riscontrato questo problema per enumerazione definita all'interno di un ambito di classe, per python 2.7.3. Ho aggiunto manualmente: salamoia (my_module.my_class.my_enum, reduce_enum), e ha funzionato. Ho rimosso il rilevamento automatico dei tipi di enumerazione: il pickling delle enumerazioni di primo livello sembrava essere stato corretto. –

+0

Buono a sapersi. Grazie. Non ho lavorato con BP da diversi anni, quindi non sono all'altezza. –