¿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
Respuesta
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.
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. –
Eso es bueno saber. Gracias. No he trabajado con BP desde hace varios años, así que no estoy al tanto de lo último. –
- 1. Boost.Python - ¿Cómo devolver por referencia?
- 2. Error de decapado por multiproceso de Python
- 3. Decapado de una definición de clase
- 4. Verdadero multithreading con boost.python
- 5. C++ Boost.Python: 2 problemas
- 6. cómo extraer una cadena Unicode con Boost.Python
- 7. Javascript enumeración dentro de una enumeración
- 8. Python Decapado ranuras de error
- 9. error de decapado en python?
- 10. Boost.Python: Devolución de llamada a funciones de clase
- 11. ¿Cómo funciona Boost.Python?
- 12. Ninguno en Boost.Python
- 13. ¿Cómo puedo pasar objetos a una función luaj expuesta?
- 14. Boost.Python clase de excepción personalizada
- 15. Configuración de metaclass de la clase envuelta con Boost.Python
- 16. ¿boost.python no admite el paralelismo?
- 17. Boost.Python y C++ std :: vector de punteros
- 18. Decapado de un gráfico con ciclos
- 19. Decapado de estilo Python para C++?
- 20. ¿El proceso de decapado es determinista?
- 21. Boost.Python: Definir un constructor fuera de una clase
- 22. La forma correcta de buscar una enumeración por valor
- 23. ¿Por qué una enumeración tiene un constructor privado de paquetes?
- 24. convertir una enumeración a otro tipo de enumeración
- 25. Decapado de varios subprocesos en Python
- 26. Enumeración de hibernación, que persiste como una enumeración
- 27. crear dinámicamente una enumeración
- 28. La exposición de un puntero en Boost.Python
- 29. Enumerar dentro de una enumeración
- 30. decapado con Gracia-degradantes en Python
+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