Протокол буфера в 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)
... но это выглядит довольно странно: /