Hello,

I am trying to build self-describing messages using Python. I read through 
the 
documentation 
https://protobuf.dev/programming-guides/techniques/#self-description 
as well as through the Python 
API https://googleapis.dev/python/protobuf/latest/google/protobuf.html, but 
I am still not very sure about how to do that.

I started with the example message 
syntax = "proto3"; import "google/protobuf/any.proto"; import 
"google/protobuf/descriptor.proto"; message SelfDescribingMessage { // Set 
of FileDescriptorProtos which describe the type and its dependencies. 
google.protobuf.FileDescriptorSet descriptor_set = 1; // The message and 
its type, encoded as an Any message. google.protobuf.Any message = 2; }

And I would like to pass through it a simple addressbook message

syntax = "proto2";

package tutorial;

message AddressBook {
  optional string name = 1;
  optional string number = 2;
}

The AddressBook message would be contained in the message field and the 
descriptor_set field would contain the descriptor of the proto above.

However I could not do this no matter what I have tried.

The closest I got was exporting a file descriptor set from the 
SelfDescribingMessage.proto given in the documentation as "protoc 
--proto_path=. --proto_path=./include 
--descriptor_set_out=./self_describing_ds --include_imports 
self_describing.proto" and then reading it

with open("self_describing_ds", 'rb') as fh:
        fds = descriptor_pb2.FileDescriptorSet.FromString(fh.read())

message_classes = message_factory.GetMessages(fds.file)
my_proto_instance = message_classes["SelfDescribingMessage"]()

address_book = addressbook_pb2.AddressBook()
address_book.name = "John Doe"
address_book.number = "123456"

my_proto_instance.message.Pack(address_book)

I am not able to set my_proto_instance.descriptor_set though. Extracting 
address book descriptor set using protoc and then reading it and trying to 
append it 

with open("addressbook_ds", 'rb') as fh:
        addressbook_fds = 
descriptor_pb2.FileDescriptorSet.FromString(fh.read()) 
my_proto_instance.descriptor_set.file.append(addressbook_fds)

fails on

TypeError: Parameter to MergeFrom() must be instance of same class: 
expected <class 'FileDescriptorProto'> got <class 
'google.protobuf.descriptor_pb2.FileDescriptorProto'>.

I could not get any closer.

Does anyone have any simple example on sending the self-describing messages 
in Python, please?

Thanks a lot in advance.

Jan




-- 
You received this message because you are subscribed to the Google Groups 
"Protocol Buffers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/protobuf/33d19ba2-d008-49d6-b54b-2075113cb5e4n%40googlegroups.com.

Reply via email to