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
方法向其中添加项。