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
risposta
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.
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. –
Buono a sapersi. Grazie. Non ho lavorato con BP da diversi anni, quindi non sono all'altezza. –
+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