Заполнение google.protobuf.struct.Value без проверки каждого типа в первую очередь? - PullRequest
0 голосов
/ 10 ноября 2019

Протокол буфера в Python автоматически устанавливает правильный вариант Value, но только при использовании ListValue . Например:

list_value = google.protobuf.struct_pb2.ListValue()
list_value.append(1)
list_value.append('a')
list_value.append(False)
list_value.append(None)

print(lv)

... выведет строковое представление ListValue с автоматически установленными вариантами Value:

values {
  number_value: 1.0
}
values {
  string_value: "a"
}
values {
  bool_value: false
}
values {
  null_value: NULL_VALUE
}

Но для * нет эквивалента Value. AFAICT, вариант должен быть известен и установлен напрямую:

value = google.protobuf.struct_pb2.Value()
value.string_value = "a"

Странная часть в том, что ListValue - это просто оболочка вокруг Value (https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/struct.proto):

// `ListValue` is a wrapper around a repeated field of values.
//
// The JSON representation for `ListValue` is JSON array.
message ListValue {
  // Repeated field of dynamically typed values.
  repeated Value values = 1;
}

// `Value` represents a dynamically typed value which can be either
// null, a number, a string, a boolean, a recursive struct value, or a
// list of values. A producer of value is expected to set one of that
// variants, absence of any variant indicates an error.
//
// The JSON representation for `Value` is JSON value.
message Value {
  // The kind of value.
  oneof kind {
    // Represents a null value.
    NullValue null_value = 1;
    // Represents a double value.
    double number_value = 2;
    // Represents a string value.
    string string_value = 3;
    // Represents a boolean value.
    bool bool_value = 4;
    // Represents a structured value.
    Struct struct_value = 5;
    // Represents a repeated `Value`.
    ListValue list_value = 6;
  }
}

// `NullValue` is a singleton enumeration to represent the null value for the
// `Value` type union.
//
//  The JSON representation for `NullValue` is JSON `null`.
enum NullValue {
  // Null value.
  NULL_VALUE = 0;
}

Скореечем проверять каждый тип перед созданием экземпляра google.protobuf.struct.Value, я мог бы использовать ListValue:

list_value = google.protobuf.struct_pb2.ListValue()
list_value.append(1)

value = google.protobuf.struct_pb2.Value()
value.CopyFrom(list_value.values[0])

# number_value: 1.0
print(value)

... но это выглядит довольно странно: /

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...