Как использовать карту prototbuf в Python? - PullRequest
0 голосов
/ 28 ноября 2018

Учитывая прототипное определение

message EndpointResult {
    int32 endpoint_id = 1;
    // property id as key
    map<int32, TimeSeries> properties = 2;
}

message TimeSeries {
    repeated TimeEntry value = 2;
}

message TimeEntry {
    int32 time_unit = 1;
    float value = 2;
}

Я хочу заполнить карту в классе EndpointResult.Я пробовал разные подходы, предложенные в документах , но все они вызывают ошибку для меня.

Настройка тестового класса

end_point_rslt = nom.EndpointResult()
end_point_rslt.endpoint_id=0

ts = nom.TimeSeries()
te = ts.value.add()
te.time_unit = 0
te.value = 5.

Затем пробуем разные подходы:

end_point_rslt.properties[0] = ts

ValueError: прямое назначение суб-сообщения не разрешено

end_point_rslt.properties[0].submessage_field = ts

AttributeError: назначение не разрешено (нет поля «submessage_field» в объекте сообщения протокола).

end_point_rslt.properties.get_or_create(0)
end_point_rslt.properties[0] = ts

ValueError: прямое назначение submessage notпозволено

end_point_rslt.properties.get_or_create(0)
end_point_rslt.properties[0].submessage_field = ts

AttributeError: назначение не разрешено (нет поля «submessage_field» в объекте сообщения протокола).

end_point_rslt.properties = {0 : ts}

AttributeError:Не допускается присвоение повторяющегося поля "свойства" в объекте сообщения протокола.

end_point_rslt.properties.get_or_create(0)
end_point_rslt.properties = {0 : ts}

TypeError: Невозможно установить составное поле

Anyпример того, как использовать карту буфера протокола в Python, был бы очень признателен!

1 Ответ

0 голосов
/ 28 ноября 2018

Посмотрев на документы, я понял, что проблема в том, что я назначил класс в словарь.

Правильный синтаксис:

end_point_rslt = nom.EndpointResult()
end_point_rslt.endpoint_id=0
te = end_point_rslt.properties[0].value.add()
te.time_unit = 0
te.value = 5.
...