3 SÉLjÒã@sddZdZddlmZddlmZejƒdkr:ddlmZ n ddlm Z e j Z iZ dd „Z d d „Zd S) a Contains a metaclass and helper functions used to create protocol message classes from Descriptor objects at runtime. Recall that a metaclass is the "type" of a class. (A class is to a metaclass what an instance is to a class.) In this case, we use the GeneratedProtocolMessageType metaclass to inject all the useful functionality into the classes output by the protocol compiler at compile-time. The upshot of all this is that the real implementation details for ALL pure-Python protocol buffers are *here in this file*. z#robinson@google.com (Will Robinson)é)Úapi_implementation)ÚmessageZcpp)Ú cpp_message)Úpython_messagecCst|ƒ}|ƒ}|j|ƒ|S)zêGenerate a new Message instance from this Descriptor and a byte string. Args: descriptor: Protobuf Descriptor object byte_str: Serialized protocol buffer byte string Returns: Newly created protobuf Message object. )Ú MakeClassZParseFromString)Ú descriptorZbyte_strZ result_classZnew_msg©rú /usr/lib/python3.6/reflection.pyÚ ParseMessageCs  r cCsd|tkrt|Si}x"|jjƒD]\}}t|ƒ||<q W||tj<tt|jƒtj f|ƒ}|t|<|S)aŒ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] 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. ) ÚMESSAGE_CLASS_CACHEZnested_types_by_nameÚitemsrÚGeneratedProtocolMessageTypeZ_DESCRIPTOR_KEYÚstrÚnamerZMessage)rZ attributesrZ nested_typeÚresultrrr rSs rN)Ú__doc__Ú __author__Zgoogle.protobuf.internalrZgoogle.protobufrZTypeZgoogle.protobuf.pyextrZ message_implrr r r rrrrr Ú.s