如何在python中按编号获取顶级protobuf枚举值名称?

aby*_*s.7 35 python protocol-buffers

例如,我有原始文件File.proto:

enum Test {
  ONE = 1;
  TWO = 2;
}
Run Code Online (Sandbox Code Playgroud)

File_pb2.py使用protoc 生成文件File.proto.我想在一个python代码中获取字符串"ONE"(对应于File_pb2.ONE的名称)的值为1(对应于File_pb2.ONE的值)来自生成的文件File_pb2.py而不定义我自己的字典.我怎样才能做到这一点?

Tis*_*sho 53

假设生成的python位于File_pb2.py代码中试试这个:

file_pb2._TEST.values_by_number[1].name
Run Code Online (Sandbox Code Playgroud)

在你的情况下,这应该给 'ONE'

相反的是:

file_pb2._TEST.values_by_name['ONE'].number
Run Code Online (Sandbox Code Playgroud)

会给1.

编辑:正如@dyoo在评论中正确指出的那样,后来在protobuf库中引入了一种新方法:

file_pb2.Test.Name(1)
file_pb2.Test.Value('One')
Run Code Online (Sandbox Code Playgroud)

编辑:这在proto3中再次发生了变化.现在,Name()和Value()方法属于EnumTypeWrapper类,因此可以访问它们,如:

file_pb2.Name(1)
file_pb2.Value('One')
Run Code Online (Sandbox Code Playgroud)

  • 这看起来很低级; 你应该能够在枚举类上使用`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的一部分 (6认同)
  • @dyoo 我几乎可以肯定,在我写回复时(2012 年 7 月 16 日)没有 Name() 方法。您引用的文件是于 2012 年 9 月 21 日创建的。不管怎样,谢谢您的评论,我会在回复中添加它。 (2认同)