2012-07-16 65 views
20

例如,我有原文件File.proto如何在python中通過數字獲取頂級protobuf枚舉值的名稱?

enum Test { 
    ONE = 1; 
    TWO = 2; 
} 

我生成文件File_pb2.py與protoc從File.proto。 我想在python代碼中從生成的文件File_pb2.py的值1(對應於File_pb2.ONE的值)獲取字符串「ONE」(對應於File_pb2.ONE的名稱),而不定義我自己的字典。我怎樣才能做到這一點?

+0

對於與'Test'相關的代碼,生成的'File_pb2.py'看起來像什麼? – 2012-07-16 10:25:30

+0

@MarcGravell'File_pb2.py'的外觀通常取決於protoc版本。這個問題表明答案是關於_standart protobuf python API_給出的,因爲我無法在任何地方找到答案。例如,在https://groups.google.com/forum/?fromgroups#!topic/protobuf/HRApuLNyYVQ – 2012-07-16 10:35:30

回答

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再次發生變化。現在Name()和Value()方法屬於EnumTypeWrapper類,因此它們可以被如下訪問:

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

上有相關問題的解答。謝謝。 – 2012-07-16 10:41:28

+3

這似乎是低級的;你應該可以在枚舉類上使用'Name()'方法來更直接地獲取它。例如'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 2013-11-19 01:40:00

+0

@dyoo的一部分我幾乎可以確定沒有Name()方法在我寫回復時(7月16'12)。你引用的文件是在12年9月21日創建的。無論如何謝謝你的評論,我會在回覆中添加它。 – Tisho 2013-11-19 08:13:12