2010-07-09 6 views
5

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

+0

+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

Odpowiedz

6

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.

+1

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

+0

Dobrze wiedzieć. Dzięki. Nie pracowałem z BP od kilku lat, więc nie mam najnowszego. –

Powiązane problemy