code: def _set_protobuf_value(value_pb, val):
      
      attr, val = _pb_attr_value(val)
      if attr == "key_value":
          value_pb.key_value.CopyFrom(val)
      elif attr == "timestamp_value":
          value_pb.timestamp_value.CopyFrom(val)
      elif attr == "entity_value":
          entity_pb = entity_to_protobuf(val)
          value_pb.entity_value.CopyFrom(entity_pb)
      elif attr == "array_value":
          if len(val) == 0:
              array_value = entity_pb2.ArrayValue(values=[])
              value_pb.array_value.CopyFrom(array_value)
          else:
              l_pb = value_pb.array_value.values
              for item in val:
                  i_pb = l_pb.add()
                  _set_protobuf_value(i_pb, item)
      elif attr == "geo_point_value":
          value_pb.geo_point_value.CopyFrom(val)
      else:  # scalar, just assign
          setattr(value_pb, attr, val)
docs: Assign 'val' to the correct subfield of 'value_pb'.
  
      The Protobuf API uses different attribute names based on value types
      rather than inferring the type.
  
      Some value types (entities, keys, lists) cannot be directly
      assigned; this function handles them correctly.
  
      :type value_pb: :class:`.entity_pb2.Value`
      :param value_pb: The value protobuf to which the value is being assigned.
  
      :type val: :class:`datetime.datetime`, boolean, float, integer, string,
                 :class:`google.cloud.datastore.key.Key`,
                 :class:`google.cloud.datastore.entity.Entity`
      :param val: The value to be assigned.