Czy można wyselekcjonować (używając cPickle) wyliczenie, które zostało wystawione przy pomocy Boost.Python? Udało mi się wytrawić inne obiekty przy użyciu pierwszej metody opisanej jako here, ale żadna z nich nie wydaje się dotyczyć typu wyliczeniowego, a obiekty nie wydają się domyślnie możliwe do wybrania.Wytrawianie enum wyeksponowanego przez Boost.Python
Odpowiedz
Nie tak jak są w module. Dano mi do zrozumienia, że jest to DOSTARCZANE, aby było możliwe, ale sposób działania instrukcji enum_ zapobiega temu.
Możesz obejść to po stronie Pythona. Gdzieś (prawdopodobnie w pliku __init__.py) zrobić coś takiego:
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()
uczyni wszystko zalewa dobrze.
Właśnie napotkałem ten problem dla wyrażeń zdefiniowanych wewnątrz zakresu klasy, dla Pythona 2.7.3. Dodałem ręcznie: pickle (my_module.my_class.my_enum, reduce_enum) i zadziałało. Usunąłem automatyczne wykrywanie typów enum - poprawiono wytrawianie tytułów najwyższego poziomu. –
Dobrze wiedzieć. Dzięki. Nie pracowałem z BP od kilku lat, więc nie mam najnowszego. –
- 1. Boost.Python - jak wrócić przez referencję?
- 2. Building Boost.Python
- 3. Wytrawianie cv2.KeyPoint powoduje PicklingError
- 4. True wielowątkowość z boost.python
- 5. Brak w boost.python
- 6. boost.python nie wspiera równoległości?
- 7. Odsłanianie wskaźnik w Boost.Python
- 8. C++ Boost.Python: 2 problemy
- 9. jak wyodrębnić ciąg Unicode boost.python
- 10. Wyjątek ClassCastException podczas rzucania wyeksponowanego widoku EJB w AS7
- 11. Enum in enum
- 12. Budynek/w tym Boost.Python w VS2013
- 13. Używanie boost.python z make zamiast bjam
- 14. Jak przekazać surowy wskaźnik do Boost.Python?
- 15. Jak zdefiniować metakl Pythona za pomocą Boost.Python?
- 16. Enum of Enum jest NULL
- 17. Jak zwrócić wartość enum przez 2 parametrów w Javie
- 18. C++ enum i używanie ich do wprowadzania danych przez użytkownika
- 19. Jaka jest potrzeba zdefiniowania Enum/Struct przez makra?
- 20. Boost.Python dodać do istniejącego powiązania PyObject (dla obsługi wyjątków)
- 21. Enum z metodami funkcjonalnymi (Combine Class/Enum)
- 22. Czy puste enum (enum {};) jest przenośne?
- 23. typedef i enum lub enum class
- 24. Różnica między klasą enum a enum?
- 25. Boost.Python: Uzyskiwanie słabego odwołania Pythona do owiniętego obiektu C++
- 26. Boost.Python - Przekazywanie boost :: python :: object jako argument do funkcji Pythona?
- 27. Change display enum
- 28. Pythona do C++ funkcja konwersji przy użyciu Boost.Python
- 29. Używanie shared_ptr do abstrakcyjnej podstawy jako właściciela z boost.python
- 30. Nazwa String z Enum Wartość
+1 Nie mogę również dowiedzieć się, jak to zrobić, ale bardzo bym chciał! (w tej chwili konwertuję wyliczenia, które muszą być najpierw marynowane w liczbach całkowitych) – James