例如,我有原文件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的名稱),而不定義我自己的字典。我怎樣才能做到這一點?
例如,我有原文件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的名稱),而不定義我自己的字典。我怎樣才能做到這一點?
假設產生的蟒蛇位於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')
上有相關問題的解答。謝謝。 – 2012-07-16 10:41:28
這似乎是低級的;你應該可以在枚舉類上使用'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
@dyoo的一部分我幾乎可以確定沒有Name()方法在我寫回復時(7月16'12)。你引用的文件是在12年9月21日創建的。無論如何謝謝你的評論,我會在回覆中添加它。 – Tisho 2013-11-19 08:13:12
對於與'Test'相關的代碼,生成的'File_pb2.py'看起來像什麼? – 2012-07-16 10:25:30
@MarcGravell'File_pb2.py'的外觀通常取決於protoc版本。這個問題表明答案是關於_standart protobuf python API_給出的,因爲我無法在任何地方找到答案。例如,在https://groups.google.com/forum/?fromgroups#!topic/protobuf/HRApuLNyYVQ – 2012-07-16 10:35:30