2012-07-16 7 views
20

उदाहरण के लिए, मैं आद्य फ़ाइल File.proto है। मैं अपने पाइथन कोड को परिभाषित किए बिना जेनरेट फ़ाइल File_pb2.py से मूल्य 1 (जो File_pb2.ONE के मान से मेल खाता है) द्वारा स्ट्रिंग "ONE" (File_pb2.ONE के नाम से मेल खाता है) में एक पायथन-कोड प्राप्त करना चाहता है। मैं उसे कैसे कर सकता हूँ?पाइथन में संख्या के आधार पर शीर्ष-स्तरीय प्रोटोबफ एनम मान नाम कैसे प्राप्त करें? <code>File.proto</code> से protoc साथ</p> <pre><code>enum Test { ONE = 1; TWO = 2; } </code></pre> <p>मैं उत्पन्न फ़ाइल <code>File_pb2.py</code>:

+0

क्या उत्पन्न 'File_pb2.py', कैसा दिखता है' Test' से संबंधित कोड के लिए? –

+0

@MarcGravell 'File_pb2.py' का रूप आम तौर पर प्रोटोक संस्करण पर निर्भर करता है। सवाल से पता चलता है कि उत्तर _standart protobuf python API_ के संबंध में दिया गया है, क्योंकि मुझे अपने आप से कहीं भी जवाब नहीं मिल रहा है। उदाहरण के लिए, https://groups.google.com/forum/?fromgroups#!topic/protobuf/HRApuLNyYVQ –

उत्तर

27

उत्पन्न अजगर मान लिया जाये कि File_pb2.py कोड में स्थित है यह प्रयास करें:

file_pb2._TEST.values_by_number[1].name 

आपके मामले में, इस देना चाहिए 'ONE'

विपरीत है:

file_pb2._TEST.values_by_name['ONE'].number 

दे देंगे 1

संपादित करें: के रूप में सही ढंग से टिप्पणी में @dyoo से इशारा किया, एक नई पद्धति बाद में Protobuf पुस्तकालय में पेश किया गया:

file_pb2.Test.Name(1) 
file_pb2.Test.Value('One') 

संपादित करें: यह proto3 में फिर से बदल गया है। अब नाम() और मूल्य() पद्धतियों EnumTypeWrapper वर्ग के हैं तो वे की तरह पहुँचा जा सकता है:

file_pb2.Name(1) 
file_pb2.Value('One') 
+0

पर संबंधित समस्या का उत्तर एक आकर्षण की तरह काम करता है। धन्यवाद। –

+3

यह निम्न स्तर लगता है; आप इसे और अधिक सीधे प्राप्त करने के लिए गणना कक्षा पर 'नाम()' विधि का उपयोग करने में सक्षम होना चाहिए। जैसे 'file_pb2.Test.Name (1) 'आपको" ONE "भी देना चाहिए। यह https://code.google.com/p/protobuf/source/browse/trunk/python/google/protobuf/internal/enum_type_wrapper.py?r=425 – dyoo

+0

@dyoo का हिस्सा है मुझे यकीन है कि वहां कोई नहीं था नाम() विधि जब मैंने उत्तर लिखा है (जुलाई 16 '12)। आपके द्वारा संदर्भित फ़ाइल 21 सितंबर, 12 को बनाई गई है। वैसे भी टिप्पणी के लिए धन्यवाद, मैं इसे उत्तर में जोड़ दूंगा। – Tisho