2010-07-09 11 views
5

Boost.Python ile karşılaşılmış bir enum'u (cPickle kullanarak) hazırlama mümkün mü? here açıklanan ilk yöntemi kullanarak başka nesneleri başarıyla seçtim, ancak hiçbiri enum türü için geçerli değil gibi görünüyor ve nesneler varsayılan olarak seçilebilir gibi görünmüyor.Boost.Python tarafından açığa çıkarılmış bir enum alınıyor Python

+0

+1 Bunu nasıl yapacağımı bilemiyorum ama çok isterim! (Şu anda en önce tamsayılara alınması gereken enumları dönüştürüyorum) – James

cevap

6

Modülde oldukları gibi değil. Bunun mümkün olduğunu İYİLEŞTİRDİĞİNİ anlıyorum, ama enum_ ifadesinin çalışma şekli bunu engelliyor.

Python tarafında bu konuda çalışabilirsiniz.

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

Bu her şeyin turşu gayet yapacaktır: Somewhere (muhtemelen bir __init__.py dosyasında) böyle bir şey yapmak.

+1

Bu sorunu python 2.7.3 için bir sınıf kapsamı içinde tanımlanan enumlarla karşılaştım. Manuel olarak ekledim: pickle (my_module.my_class.my_enum, reduce_enum) ve çalıştı. Enum türlerinin otomatik algılanmasını kaldırdım - en üst düzey enumların arındırılması düzeltilmiş gibi görünüyor. –

+0

Bunu bilmek güzel. Teşekkürler. Birkaç yıldır BP ile çalışmıyorum, bu yüzden en sonda değilim. –

İlgili konular