Подтвердить что ты не робот

Как получить имя protobuf enum наивысшего уровня по номеру в python?

Например, у меня есть прото файл File.proto:

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

Я создаю файл File_pb2.py с protoc от File.proto. Я хочу, чтобы в python-коде получить строку "ONE" (которая соответствует имени File_pb2.ONE) значением 1 (что соответствует значению File_pb2.ONE) из сгенерированного файла File_pb2.py без определения моих собственных словарей. Как я могу это сделать?

4b9b3361

Ответ 1

Предположим, что сгенерированный python находится в файле File_pb2.py. Попробуйте следующее:

file_pb2._TEST.values_by_number[1].name

В вашем случае это должно дать 'ONE'

Реверс:

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

даст 1.

EDIT: как правильно указано @dyoo в комментариях, новый метод был позже представлен в библиотеке protobuf:

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

EDIT: Это снова изменилось в proto3. Теперь методы Name() и Value() относятся к классу EnumTypeWrapper, поэтому к ним можно получить доступ, например:

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