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