[英]Protobuf and Python: How to add messages to "repeatable Any" field?
我有一個原始消息:
syntax = "proto3";
import "google/protobuf/any.proto";
message Task {
repeated google.protobuf.Any targets = 1;
// ...
}
message Target {
string name = 1;
// ...
}
我應該如何將 Target 消息添加到Task.targets
?
在官方文檔中,我找到了有關如何為單個Any類型值賦值的信息,但是在我的情況下,我repeated Any
字段類型。
編輯: Task.targets
可能包含不同類型的目標,這就是使用Any
類型的原因。 單個Target
消息僅用於最小的可重現示例。
謝謝@Justin Schoen。 根據https://developers.google.com/protocol-buffers/docs/reference/java/com/google/protobuf/Any ,您需要先創建一個 Any 對象,然后打包一個 Target (或任何其他對象類型)在將其附加到重復列表之前。
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;
targets
可以是任何值,例如(string、bool、int 等)。 這就是我在 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()
我對any
類型的了解有限,但我認為可以將其視為repeated
的Target
消息列表。
蟒蛇代碼:
task_targets = []
task_targets.append(<insert_pb2_import>.Target(name='test'))
return <insert_pb2_import>.Task(targets=task_targets)
在玩了一段時間后,我決定修改使用重復 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)
我沒有將我的答案標記為正確,因為這只是一種解決方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.