簡體   English   中英

Protobuf 和 Python:如何將消息添加到“可重復的任何”字段?

[英]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類型的了解有限,但我認為可以將其視為repeatedTarget消息列表。

蟒蛇代碼:

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

在玩了一段時間后,我決定修改使用重復 Any 的解決方案。 這里有一個給那些被困在同一個地方的人的建議:嘗試使用特定類型而不是Any

針對我的情況的解決方法是創建包含特定目標的SpecificTargetSet1SpecificTargetSet2等類型的消息。 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM