python protobuf назначить словарь для любых полей Google Proto - PullRequest
0 голосов
/ 23 марта 2020

У меня есть файл .prot, который состоит из следующих полей user.proto

message Integration {
 string db_name = 1;
 oneof payload {
        Asset asset = 2;
        }
     }
message Asset {
 string address = 1;
 google.protobuf.Any extra_fields = 2;
 }

Я просто хочу назначить большой словарь для extra_fields, как показано ниже

, импортируя сгенерированный файл pb2

import user_pb2
i = user_pb2.Integration()
i.db_name = "sdsdsd"
i.asset.address = "sdsd"
i.asset.extra_fields = {"assd":"sdsd","sd":"asd"...}

но это поднимает

AttributeError: Assignment not allowed to field "extra_fields" in the protocol message object.

Я не хочу указывать имена полей в прото, потому что мой dict содержит более 100 полей, я просто хочу назначить общее значение dict для extra Кто-нибудь может подсказать, как вставить dict в дополнительные поля?

Ответы [ 2 ]

0 голосов
/ 27 марта 2020

Наконец, мы выяснили, как напрямую добавить dict в protobuf, используя ключевое слово struct в google protobuf

message Integration {
 string db_name = 1;
 oneof payload {
        Asset asset = 2;
        }
     }
message Asset {
 string address = 1;
google.protobuf.Struct extra_fields = 2;

 }

вместо любого используемого нами в присваивании struct, мы можем напрямую обновить dict

import user_pb2
i = user_pb2.Integration()
i.db_name = "sdsdsd"
i.asset.address = "sdsd"
i.asset.extra_fields.update({"assd":"sdsd","sd":"asd"})
0 голосов
/ 23 марта 2020

Вам просто нужно пропустить .asset и назначить i.address или i.extra_fields напрямую. Например:

i.extra_fields = {"a": "b"}

см. Документацию: https://developers.google.com/protocol-buffers/docs/reference/python-generated#oneof

...