Protobuf и Python: как добавить сообщения в поле «Любое повторяющееся»? - PullRequest
0 голосов
/ 03 июня 2019

У меня есть прото-сообщение:

syntax = "proto3";

import "google/protobuf/any.proto";

message Task {
    repeated google.protobuf.Any targets = 1;
    // ...
}

message Target {
    string name = 1;
    // ...
}

Как добавить целевые сообщения в Task.targets?

В официальных документах я нашел информацию о том, как присвоить значение одному Любому значению типа, однако в моем случае у меня есть repeated Any тип поля.

Редактировать : Task.targets может содержать различные типы целей, поэтому используется тип Any. Одно сообщение Target предназначено только для минимального воспроизводимого примера.

Ответы [ 2 ]

0 голосов
/ 03 июня 2019

Поработав некоторое время, я решил пересмотреть решение, использующее повторение Any.И вот совет для тех, кто застрял в этом же месте: попробуйте использовать конкретные типы вместо Any.

Обходной путь для моей ситуации - создавать сообщения типов SpecificTargetSet1, SpecificTargetSet2и т. д., которые содержат конкретные цели.Файл прото Task будет выглядеть так:

message Task {
    google.protobuf.Any target_set = 1;
}

Файл протока набора целей:

message SpecificTargetSet1 {
    repeated SpecificTarget1 targets = 1;
}

И теперь задача может быть создана таким образом:

target = Target()
target.name = "Some name"

target_set = SpecificTargetSet1()
target_set.targets.append(target)

task = Task()
task.target_set.Pack(target_set)

Я не отмечаю свой ответ как правильный, так как это всего лишь обходной путь.

0 голосов
/ 03 июня 2019

У меня ограниченные знания о типе any, но я бы подумал, что его можно рассматривать, как если бы это был repeated список Target сообщений.

Код Python:

task_targets = []
task_targets.append(<insert_pb2_import>.Target(name='test'))
return <insert_pb2_import>.Task(targets=task_targets)
...