簡體   English   中英

如何在python3中獲取protobuf的RepeatedCompositeContainer或RepeatedScalarContainer包含的類型?

[英]How to get type contained by protobuf's RepeatedCompositeContainer or RepeatedScalarContainer in python3?

我正在編寫一個用於序列化和發送protobuf3消息的 Python 應用程序。 我想制作某種交互式用戶界面,允許選擇一條消息並即時分配它。 我有一大堆這些消息,因此我不想為每條消息都創建一個get函數,而是創建一個可以處理所有消息的函數。

get所有消息字段,我可以簡單地獲取所有消息的屬性並選擇那些作為其字段的屬性,這很容易。 然后,要知道屬性是什么類型,我使用type(getattr(my_message, current_field)) 現在問題來了。 假設這些是我的消息:

message myMess1 {
    //some fields
}

message myMess2 {
    string some_string = 1
    repeated myMess1 myMess1Field = 2
}

現在,分配 some_string 字段沒有問題。

type(getattr(myMess2Instance, someStringFieldName))返回string ,所以我知道用字符串提供它。

但是如何處理重復的 myMess1 字段呢? type(getattr(MyMess2Instance, myMess1FieldName))實際上返回google.protobuf.pyext._message.RepeatedCompositeContainer ,它沒有說明其中包含的類型。 我怎么才能得到它?

我有一個類似的 Protobuf 解析問題,這是我所做的“希望它有幫助”:

假設我們有這個響應消息:

>>> msg
path {
}
path {
  value: "Arts & Entertainment"
}
path {
  value: "Comics & Animation"
}

將其轉換為字典:

>>> from google.protobuf.json_format import MessageToDict
>>> d = MessageToDict(msg)
{'path': ['', 'Arts & Entertainment', 'Comics & Animation']}

將值的字典列表作為字符串加入:

>>> " ".join(d["path"]).strip()
'Arts & Entertainment Comics & Animation'

這確實讓我困惑了一段時間,因為似乎沒有生成任何文檔。 關鍵是要看到RepeatedCompositeContainer行為就像一個列表。 您可以對內容進行迭代,在示例myMess1生成myMess1類型。 例如:

for myMess1Element in myMess2Instance.myMess1FieldName:
    print(f"{myMess1Element.some_field=}")
    print(f"{myMess1Element.other_field=}")

如果您以某種方式提前知道該消息的重復次數,則可以索引特定的消息。 例如:

print(f"{myMess2Instance.myMess1FieldName[0]}")

但是,建議檢查長度,因為消息可以重復任意次數(包括零次)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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