diff options
author | jieluo@google.com <jieluo@google.com@630680e5-0e50-0410-840e-4b1c322b438d> | 2014-08-12 21:10:30 +0000 |
---|---|---|
committer | jieluo@google.com <jieluo@google.com@630680e5-0e50-0410-840e-4b1c322b438d> | 2014-08-12 21:10:30 +0000 |
commit | bde4a3254a7de58911941b0fbf38e9dd992de973 (patch) | |
tree | 02b151c2ec6e9be2e9d5ea0efc406aabe6958ae7 /python/google/protobuf/reflection.py | |
parent | d7339318a33c5f9e8b5dded4077223fbd4ebf229 (diff) | |
download | protobuf-bde4a3254a7de58911941b0fbf38e9dd992de973.tar.gz protobuf-bde4a3254a7de58911941b0fbf38e9dd992de973.tar.bz2 protobuf-bde4a3254a7de58911941b0fbf38e9dd992de973.zip |
down integrate python opensource to svn
Diffstat (limited to 'python/google/protobuf/reflection.py')
-rwxr-xr-x | python/google/protobuf/reflection.py | 46 |
1 files changed, 41 insertions, 5 deletions
diff --git a/python/google/protobuf/reflection.py b/python/google/protobuf/reflection.py index 9570fd50..7aac6230 100755 --- a/python/google/protobuf/reflection.py +++ b/python/google/protobuf/reflection.py @@ -57,7 +57,7 @@ _FieldDescriptor = descriptor_mod.FieldDescriptor if api_implementation.Type() == 'cpp': if api_implementation.Version() == 2: - from google.protobuf.internal.cpp import cpp_message + from google.protobuf.pyext import cpp_message _NewMessage = cpp_message.NewMessage _InitMessage = cpp_message.InitMessage else: @@ -91,6 +91,10 @@ class GeneratedProtocolMessageType(type): myproto_instance = MyProtoClass() myproto.foo_field = 23 ... + + The above example will not work for nested types. If you wish to include them, + use reflection.MakeClass() instead of manually instantiating the class in + order to create the appropriate class structure. """ # Must be consistent with the protocol-compiler code in @@ -159,11 +163,43 @@ def ParseMessage(descriptor, byte_str): Returns: Newly created protobuf Message object. """ + result_class = MakeClass(descriptor) + new_msg = result_class() + new_msg.ParseFromString(byte_str) + return new_msg + - class _ResultClass(message.Message): +def MakeClass(descriptor): + """Construct a class object for a protobuf described by descriptor. + + Composite descriptors are handled by defining the new class as a member of the + parent class, recursing as deep as necessary. + This is the dynamic equivalent to: + + class Parent(message.Message): __metaclass__ = GeneratedProtocolMessageType DESCRIPTOR = descriptor + class Child(message.Message): + __metaclass__ = GeneratedProtocolMessageType + DESCRIPTOR = descriptor.nested_types[0] - new_msg = _ResultClass() - new_msg.ParseFromString(byte_str) - return new_msg + Sample usage: + file_descriptor = descriptor_pb2.FileDescriptorProto() + file_descriptor.ParseFromString(proto2_string) + msg_descriptor = descriptor.MakeDescriptor(file_descriptor.message_type[0]) + msg_class = reflection.MakeClass(msg_descriptor) + msg = msg_class() + + Args: + descriptor: A descriptor.Descriptor object describing the protobuf. + Returns: + The Message class object described by the descriptor. + """ + attributes = {} + for name, nested_type in descriptor.nested_types_by_name.items(): + attributes[name] = MakeClass(nested_type) + + attributes[GeneratedProtocolMessageType._DESCRIPTOR_KEY] = descriptor + + return GeneratedProtocolMessageType(str(descriptor.name), (message.Message,), + attributes) |