2010-07-09 16 views
5

द्वारा उजागर एक enum पिकलिंग क्या Boost.Python के साथ उजागर किया गया है कि एक enum चुनने (सीपीकल का उपयोग कर) संभव है? मैंने here वर्णित पहली विधि का उपयोग करके सफलतापूर्वक अन्य ऑब्जेक्ट्स को चुना है, लेकिन इनमें से कोई भी एनम प्रकार के लिए लागू नहीं होता है, और ऑब्जेक्ट डिफ़ॉल्ट रूप से अस्थिर प्रतीत नहीं होता है।Boost.Python

+0

+1 मैं यह नहीं कर सकता कि यह कैसे करना है, लेकिन बहुत पसंद है! (फिलहाल मैं उन enums को परिवर्तित करता हूं जिन्हें पहले पूर्णांक में चुना जाना चाहिए) – James

उत्तर

6

जैसा कि वे मॉड्यूल में नहीं हैं। मुझे यह समझने के लिए दिया गया है कि यह संभव होने के लिए तैयार है, लेकिन जिस तरह से enum_ कथन काम करता है इसे रोकता है।

आप पाइथन पक्ष पर इसके आसपास काम कर सकते हैं।

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

यह सब कुछ अचार ठीक कर देगा: कहीं (शायद एक __init__.py फ़ाइल में) कुछ इस तरह से करते हैं।

+1

मुझे पाइथन 2.7.3 के लिए क्लास स्कोप के अंदर परिभाषित enums के लिए इस समस्या का सामना करना पड़ा। मैंने मैन्युअल रूप से जोड़ा: अचार (my_module.my_class.my_enum, reduce_enum), और यह काम किया। मैंने enum प्रकारों के ऑटो डिटेक्शन को हटा दिया - शीर्ष स्तर के enums के pickling तय किया गया प्रतीत होता है। –

+0

यह जानना अच्छा है। धन्यवाद। मैंने बीपी के साथ कई सालों से काम नहीं किया है, इसलिए मैं नवीनतम पर नहीं हूं। –

संबंधित मुद्दे