Python 3.x Protobuf和Python:如何将消息添加到;可重复的任意“;领域

Python 3.x Protobuf和Python:如何将消息添加到;可重复的任意“;领域,python-3.x,protocol-buffers,grpc,protoc,protobuf-3,Python 3.x,Protocol Buffers,Grpc,Protoc,Protobuf 3,我有一条原始信息: syntax=“proto3”; 导入“google/protobuf/any.proto”; 消息任务{ 重复google.protobuf.Any targets=1; // ... } 消息目标{ 字符串名称=1; // ... } 我应该如何将目标消息添加到任务.targets 在官方文档中,我找到了关于如何将值分配给单个类型值的信息,但是在我的例子中,重复了任何字段类型 编辑:任务。目标可能包含不同类型的目标,这就是使用任何类型的目标的原因。单个Target消息仅

我有一条原始信息:

syntax=“proto3”;
导入“google/protobuf/any.proto”;
消息任务{
重复google.protobuf.Any targets=1;
// ...
}
消息目标{
字符串名称=1;
// ...
}
我应该如何将目标消息添加到
任务.targets

在官方文档中,我找到了关于如何将值分配给单个类型值的信息,但是在我的例子中,
重复了任何
字段类型


编辑
任务。目标
可能包含不同类型的目标,这就是使用任何类型的目标的原因。单个
Target
消息仅用于最小的可重复性示例。

我对
任何类型的
知之甚少,但我认为可以将其视为
重复的
目标消息列表

Python代码:

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

我对
任何类型的
知之甚少,但我认为可以将其视为
重复的
目标
消息列表

Python代码:

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

在玩了一段时间之后,我决定修改使用重复任何操作的解决方案。这里有一个建议给那些在同一个地方被困的人: 尝试使用特定类型,而不是
Any

针对我的情况,一种解决方法是创建包含特定目标的
SpecificTargetSet1
SpecificTargetSet2
等类型的消息。
任务
原型文件如下所示:

消息任务{
google.protobuf.Any target_set=1;
}
目标集原型文件:

消息SpecificTargetSet1{
重复的SpecificTarget1目标=1;
}
现在可以这样创建一个任务:

target=target()
target.name=“某个名称”
target_set=SpecificTargetSet1()
target\u set.targets.append(目标)
任务=任务()
task.target\u set.Pack(target\u set)


我不认为我的答案是正确的,因为这只是一个解决办法。

经过一段时间的思考,我决定修改使用重复任何答案的解决方案。这里有一个建议给那些在同一个地方被困的人: 尝试使用特定类型,而不是
Any

针对我的情况,一种解决方法是创建包含特定目标的
SpecificTargetSet1
SpecificTargetSet2
等类型的消息。
任务
原型文件如下所示:

消息任务{
google.protobuf.Any target_set=1;
}
目标集原型文件:

消息SpecificTargetSet1{
重复的SpecificTarget1目标=1;
}
现在可以这样创建一个任务:

target=target()
target.name=“某个名称”
target_set=SpecificTargetSet1()
target\u set.targets.append(目标)
任务=任务()
task.target\u set.Pack(target\u set)


我不认为我的答案正确,因为这只是一个解决办法。

谢谢@Justin Schoen。根据,您需要首先创建一个Any对象,然后打包一个目标(或任何其他对象类型),然后再将其附加到重复列表中

from google.protobuf.any_pb2 import Any
task = Task()
target = Any()
target.Pack(Target())
task.targets.append(any)

谢谢@Justin Schoen。根据,您需要首先创建一个Any对象,然后打包一个目标(或任何其他对象类型),然后再将其附加到重复列表中

from google.protobuf.any_pb2 import Any
task = Task()
target = Any()
target.Pack(Target())
task.targets.append(any)

在我自己寻找答案之后,我发现这个线程是最相关的,所以如果我的解决方案对任何人都有帮助的话,我将在这里发布我的解决方案(但在Java/Scala中)

如果你愿意

repeated google.protobuf.Any targets = 1;
目标
可以是任何值,如(字符串、布尔值、整数等)。我在scala/java中就是这样做的:

val task = Task.newBuilder()
    .addTargets(Any.pack(StringValue.of("iss")))
    .addTargets(Any.pack(Int32Value.of(25544)))
    .addTargets(Any.pack(DoubleValue.of(1004.882447947814)))
    .addTargets(Any.pack(DoubleValue.of(84.90917890132)))
    .addTargets(Any.pack(DoubleValue.of(14.620929684)))
    .addTargets(Any.pack(StringValue.of("kilometers")))
    .build()

在我自己寻找答案之后,我发现这个线程是最相关的,所以如果我的解决方案对任何人都有帮助的话,我将在这里发布我的解决方案(但在Java/Scala中)

如果你愿意

repeated google.protobuf.Any targets = 1;
目标
可以是任何值,如(字符串、布尔值、整数等)。我在scala/java中就是这样做的:

val task = Task.newBuilder()
    .addTargets(Any.pack(StringValue.of("iss")))
    .addTargets(Any.pack(Int32Value.of(25544)))
    .addTargets(Any.pack(DoubleValue.of(1004.882447947814)))
    .addTargets(Any.pack(DoubleValue.of(84.90917890132)))
    .addTargets(Any.pack(DoubleValue.of(14.620929684)))
    .addTargets(Any.pack(StringValue.of("kilometers")))
    .build()

简单测试给出错误:
TypeError:MergeFrom()的参数必须是同一类的实例:预期为google.protobuf.Any get Target
看起来您需要初始化
Any
数组,然后使用
pack
方法向其中添加项。简单测试给出错误:
TypeError:MergeFrom()的参数必须是同一类的实例:预期为google.protobuf.Any get Target
看起来您需要初始化
Any
数组,然后使用
pack
方法向其中添加项。