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. pickling scipy interp1d spline
- 2. Esponendo un puntatore in Boost.Python
- 3. Edificio Boost.Python
- 4. Get enum da attributo enum
- 5. True multithreading con boost.python
- 6. Espressioni costanti da un Enum
- 7. Nessuno in Boost.Python
- 8. C++ Boost.Python: 2 problemi
- 9. Come passare un puntatore raw a Boost.Python?
- 10. Edificio/incluso Boost.Python in VS2013
- 11. Tracciamento non esposto Oggetti monouso
- 12. Convertire da enum ordinal a enum tipo
- 13. Come modificare un oggetto non esposto in un pacchetto
- 14. Boost.Python: Come esporre std :: unique_ptr
- 15. Classe di eccezione personalizzata Boost.Python
- 16. Boost.Python - Come restituire per riferimento?
- 17. boost.python non supporta il parallelismo?
- 18. Come lanciare un'eccezione da un costruttore enum?
- 19. Impostazione metaclasse di classe wrapping con Boost.Python
- 20. C: Mappa stringa da ENUM
- 21. Cambio da bitarray a enum
- 22. Boost.Python e C++ std :: vettore di puntatori
- 23. Valore casuale da flag enum
- 24. Popolamento Swing JComboBox da Enum
- 25. come restituire enum da JNI
- 26. Dozer Stringa da enum mappatura
- 27. Boost.Python: Definire un costruttore di fuori di una classe
- 28. Java: scegli un valore casuale da un enum?
- 29. Android: come impostare un valore Gradle da un enum sapere
- 30. Come posso inizializzare un enum da un Int o Byte?
+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