2012-07-16 7 views
20

Por ejemplo, he proto-archivo File.proto:¿Cómo obtener el nombre de valor de protobuf enum de mayor nivel por número en python?

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

genero archivo File_pb2.py con protoc de File.proto. Quiero en un código de python obtener la cadena "ONE" (que corresponde al nombre de File_pb2.ONE) por el valor 1 (que corresponde al valor de File_pb2.ONE) del archivo generado File_pb2.py sin definir mis propios diccionarios. ¿Cómo puedo hacer eso?

+0

¿Cómo es generado 'File_pb2.py' como por el código relativo a' test'? –

+0

@MarcGravell el aspecto de 'File_pb2.py' generalmente depende de la versión del protocolo. La pregunta sugiere que la respuesta se da con respecto a _standart protobuf python API_, ya que no puedo encontrar la respuesta en ninguna parte. Por ejemplo, hay una respuesta para un problema relacionado en https://groups.google.com/forum/?fromgroups#!topic/protobuf/HRApuLNyYVQ –

Respuesta

27

Suponiendo que el pitón generada se encuentra en el código File_pb2.py Prueba esto:

file_pb2._TEST.values_by_number[1].name 

En su caso, esto debería dar 'ONE'

Lo contrario es:

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

dará 1.

EDIT: Como se ha señalado correctamente por @dyoo en los comentarios, un nuevo método fue introducido más tarde en la biblioteca protobuf:

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

EDIT: Esto ha cambiado de nuevo en proto3. Ahora el Nombre() y el valor() métodos pertenecen a la clase EnumTypeWrapper para que se pueda acceder como:

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

Funciona como un encanto. Gracias. –

+3

Esto parece de bajo nivel; Debería poder usar el método 'Name()' en la clase de enumeración para obtener más información. p.ej. 'file_pb2.Test.Name (1)' también debería darle "ONE". Es parte de https://code.google.com/p/protobuf/source/browse/trunk/python/google/protobuf/internal/enum_type_wrapper.py?r=425 – dyoo

+0

@dyoo Estoy casi seguro de que no hubo Método Name() en el momento en que escribí la respuesta (16 de julio de 12). El archivo que refiere se ha creado el 21 de septiembre de '12. De todos modos, gracias por el comentario, lo agregaré en la respuesta. – Tisho

Cuestiones relacionadas