2012-07-16 5 views
20

Na przykład, mieć proto plik File.proto:Jak uzyskać nazwę najwyższego poziomu protobuf enum według numeru w pythonie?

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

wygenerować plik File_pb2.py z protoc z File.proto. Chcę w kodzie Pythona uzyskać ciąg "ONE" (który odpowiada nazwie File_pb2.ONE) o wartość 1 (która odpowiada wartości File_pb2.ONE) z wygenerowanego pliku File_pb2.py bez definiowania własnych słowników. Jak mogę to zrobić?

+0

Czego generowane 'File_pb2.py' wyglądać, kodu odnoszącego się do' Test'? –

+0

@MarcGravell wygląd 'File_pb2.py' zasadniczo zależy od wersji protokołu. Pytanie sugeruje, że odpowiedź jest udzielona w odniesieniu do _standart protobuf python API_, ponieważ nie mogę znaleźć odpowiedzi nigdzie sam. Na przykład istnieje odpowiednia odpowiedź na https://groups.google.com/forum/?fromgroups#!topic/protobuf/HRApuLNyYVQ –

Odpowiedz

27

Zakładając wygenerowany Pythona znajduje się w kodzie File_pb2.py Spróbuj tego:

file_pb2._TEST.values_by_number[1].name 

W twoim przypadku, to powinien dać 'ONE'

Odwrotna jest:

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

da 1.

EDIT: Jak słusznie zauważył przez @dyoo w komentarzach, nowa metoda została później wprowadzona w Protobuf biblioteki:

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

EDIT: To po raz kolejny zmieniła się w proto3. Teraz nazwa() and Value() metody należą do klasy EnumTypeWrapper dzięki czemu mogą one być dostępne jak:

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

Działa jak urok. Dzięki. –

+3

Wydaje się, że jest to niski poziom; powinieneś być w stanie użyć metody 'Name()' na klasie wyliczeniowej, aby uzyskać bardziej bezpośrednio. na przykład 'file_pb2.Test.Name (1)' powinno również dać ci "JEDEN". Jest częścią https://code.google.com/p/protobuf/source/browse/trunk/python/google/protobuf/internal/enum_type_wrapper.py?r=425 – dyoo

+0

@dyoo Jestem prawie pewien, że nie było Metoda Name() w czasie, gdy pisałem odpowiedź (Jul 16 '12). Plik, który polecasz, został utworzony 21 września '12. W każdym razie dziękuję za komentarz, dodam go w odpowiedzi. – Tisho

Powiązane problemy