parameters: (proto, name, val)
docstring: Assign a Python object to a protobuf message, based on the Python
      type (in recursive fashion). Lists become repeated fields/messages, dicts
      become messages, and other types are assigned directly.
docstring_summary: Assign a Python object to a protobuf message, based on the Python
      type (in recursive fashion). Lists become repeated fields/messages, dicts
      become messages, and other types are assigned directly.
docstring_tokens: Assign a Python object to a protobuf message based on the Python type ( in recursive fashion ) . Lists become repeated fields / messages dicts become messages and other types are assigned directly .
function: def assign_proto(proto, name, val):
      """Assign a Python object to a protobuf message, based on the Python
      type (in recursive fashion). Lists become repeated fields/messages, dicts
      become messages, and other types are assigned directly."""
  
      if isinstance(val, list):
          if isinstance(val[0], dict):
              for item in val:
                  proto_item = getattr(proto, name).add()
                  for k, v in six.iteritems(item):
                      assign_proto(proto_item, k, v)
          else:
              getattr(proto, name).extend(val)
      elif isinstance(val, dict):
          for k, v in six.iteritems(val):
              assign_proto(getattr(proto, name), k, v)
      else:
          setattr(proto, name, val)
function_tokens: def assign_proto ( proto , name , val ) : if isinstance ( val , list ) : if isinstance ( val [ 0 ] , dict ) : for item in val : proto_item = getattr ( proto , name ) . add ( ) for k , v in six . iteritems ( item ) : assign_proto ( proto_item , k , v ) else : getattr ( proto , name ) . extend ( val ) elif isinstance ( val , dict ) : for k , v in six . iteritems ( val ) : assign_proto ( getattr ( proto , name ) , k , v ) else : setattr ( proto , name , val )