I see, the problem is that you've created a copy of descriptor.proto and are extending that rather than extending the original file.
To correctly extend descriptor.proto, you need to import it like: import "google/protobuf/descriptor.proto"; The path name is important, because it determines which module your generated code imports and extends. You want it to import google.protobuf.descriptor_pb2 (which is included in the protobuf library), not your own local copy of descriptor_pb2. Note that when you install protocol buffers, a copy of descriptor.proto is placed in $PREFIX/include/google/protobuf (where $PREFIX is usually /usr or /usr/local). So you should invoke protoc like: protoc -I. -I/usr/include ooo.proto This way ooo.proto will be able to import google/protobuf/descriptor.proto, which protoc will find in /usr/include. On Thu, Nov 18, 2010 at 4:32 AM, Vsevolod Zadubrovsky <zadubrov...@gmail.com > wrote: > Kenton, > > I didn't find how to attach file in the group discussion, so am replying to > you directly. > In attach you will find the source proto file, the generated *pb2.py files, > and the test program enum_test.py > I used: google protobuf 2.3.0 and proto compiler 2.3.0 win32 from here: > http://code.google.com/p/protobuf/downloads/list > > The test output is: > > E:\projects\gpb>python enum_test.py > serialized request☺►☻: > Traceback (most recent call last): > File "enum_test.py", line 13, in <module> ext = > opts.Extensions[proto.verbose_enum_value_option] > File > "C:\Python27\lib\site-packages\protobuf-2.3.0-py2.7.egg\google\protobuf\reflection.py", > line 1068, in __getitem__ > _VerifyExtensionHandle(self._extended_message, extension_handle) > File > "C:\Python27\lib\site-packages\protobuf-2.3.0-py2.7.egg\google\protobuf\reflection.py", > line 229, in _VerifyExtensionHandle > message.DESCRIPTOR.full_name)) > > KeyError: 'Extension "verbose_enum_value_option" extends message type > "google.protobuf.EnumValueOptions", but this message is of type > "google.protobuf.EnumValueOptions".' > > Thnk you very much for support > > 2010/11/17 Kenton Varda <ken...@google.com> > > That is strange. Can you provide a minimal but complete program that >> reproduces this problem, so I can look at it? >> >> On Wed, Nov 10, 2010 at 12:42 AM, Vsevolod Zadubrovsky < >> zadubrov...@gmail.com> wrote: >> >>> It seems to me, it doesn't work at all. >>> >>> I got this: >>> >(Pdb) import ooo >>> >(Pdb) vals_by_nums = >>> req.DESCRIPTOR.fields_by_name['error'].enum_type.values_by_number[req.error] >>> >(Pdb) options = vals_by_nums.GetOptions() >>> >(Pdb) options.Extensions[ooo.verbose_enum_value_option] >>> *** KeyError: 'Extension "verbose_enum_value_option" extends message >>> type "google.protobuf.EnumValueOptions", but this message is of type >>> "google.protobuf.EnumValueOptions".' >>> >>> I've checked the source code, and it looks like raised from here >>> (google.protobuf.reflection, line 224): >>> >>> if extension_handle.containing_type is not message.DESCRIPTOR: >>> raise KeyError('Extension "%s" extends message type "%s", but this >>> ' >>> 'message is of type "%s".' % >>> (extension_handle.full_name, >>> extension_handle.containing_type.full_name, >>> message.DESCRIPTOR.full_name)) >>> >>> Any ideas ? may be it is already solved in trunk version? >>> >>> Thanks >>> >>> >>> On Nov 10, 1:50 am, Kenton Varda <ken...@google.com> wrote: >>> > You need to use the descriptor for the enum type. Unfortunately this >>> > interface isn't very well fleshed-out in Python. I think you'd have to >>> > write something like: >>> > >>> > >>> Request.DESCRIPTOR.fields_by_name['error'].enum_type.values_by_number[message.error].options.Extensions[verbose_enum_value_option] >>> > >>> > I haven't checked that that's exactly correct, but it gives you an >>> idea. We >>> > should probably improve this. >>> > >>> > On Tue, Nov 9, 2010 at 4:12 AM, Vsevolod Zadubrovsky >>> > <zadubrov...@gmail.com>wrote: >>> >>> > >>> > > Hi, I'm stuck with getting the enum value option in Python. The proto >>> > > file is: >>> > >>> > > import "descriptor.proto"; >>> > >>> > > extend google.protobuf.EnumValueOptions { >>> > > optional string verbose_enum_value_option = 50005; >>> > > } >>> > >>> > > enum ErrorType { >>> > > OK = 1 [(verbose_enum_value_option) = "OK"]; >>> > > SOME_ERROR = 2 [(verbose_enum_value_option) = "Some Error >>> verbose >>> > > message"]; >>> > > } >>> > >>> > > message Request { >>> > > required bool success = 1; >>> > > optional ErrorType error = 2; >>> > > } >>> > >>> > > When I receive the Request message, I can access the 'error' field, >>> > > and its type is int, that's actually ok. But how can I get the >>> > > verbose_enum_value_option of 'error' field value ? >>> > >>> > > Thanks >>> > >>> > > p.s. The goal is to keep error types and their verbose error messages >>> > > in one place, available for every service in our project, so the >>> error >>> > > messages would've been identical. >>> > >>> > > -- >>> > > You received this message because you are subscribed to the Google >>> Groups >>> > > "Protocol Buffers" group. >>> > > To post to this group, send email to proto...@googlegroups.com. >>> > > To unsubscribe from this group, send email to >>> > > protobuf+unsubscr...@googlegroups.com<protobuf%2bunsubscr...@googlegroups.com> >>> <protobuf%2bunsubscr...@googlegroups.com<protobuf%252bunsubscr...@googlegroups.com> >>> > >>> >>> > > . >>> > > For more options, visit this group at >>> > >http://groups.google.com/group/protobuf?hl=en. >>> > >>> > >>> >>> -- >>> You received this message because you are subscribed to the Google Groups >>> "Protocol Buffers" group. >>> To post to this group, send email to proto...@googlegroups.com. >>> To unsubscribe from this group, send email to >>> protobuf+unsubscr...@googlegroups.com<protobuf%2bunsubscr...@googlegroups.com> >>> . >>> For more options, visit this group at >>> http://groups.google.com/group/protobuf?hl=en. >>> >>> >> > -- You received this message because you are subscribed to the Google Groups "Protocol Buffers" group. To post to this group, send email to proto...@googlegroups.com. To unsubscribe from this group, send email to protobuf+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/protobuf?hl=en.