Re: [protobuf] Re: python enum values option
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\gpbpython 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.comwrote: 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
Re: [protobuf] Re: python enum values option
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.comwrote: 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.comprotobuf%2bunsubscr...@googlegroups.com protobuf%2bunsubscr...@googlegroups.comprotobuf%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.comprotobuf%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.
[protobuf] Re: python enum values option
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.comwrote: 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.comprotobuf%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.