Hi, this is the group for gRPC specific discussions, since this question is related only to Protobuf, I'd suggest ask this in the Protobuf group <https://groups.google.com/g/protobuf>.
Best, Xuan On Sunday, March 19, 2023 at 5:42:10 PM UTC-7 Jens Troeger wrote: > Hello, > > I’m a bit confused about Protobuf package declarations and how they’re > compiled to a Python package. > > From the Python docs > <https://protobuf.dev/reference/python/python-generated/#package>: > > *The Python code generated by the protocol buffer compiler is completely > unaffected by the package name defined in the .proto file. Instead, Python > packages are identified by directory structure.* > > Take Google’s *Timestamp > <https://github.com/protocolbuffers/protobuf/blob/9b4a3ed9e46b2542185ce6f6e21656955708808f/src/google/protobuf/timestamp.proto#L33>* > > for example: the declared package is > > > *package google.protobuf* > When I install the googleapis-common-protos > <https://github.com/googleapis/python-api-common-protos/tree/main/google> > Python package, then the *Timestamp* class lives in > google/protobuf/timestamp_pb2.py — so that’s the *google.protobuf* package > <https://docs.python.org/3/tutorial/modules.html#packages>, and the > *timestamp_pb2* module <https://docs.python.org/3/tutorial/modules.html> > according > to Python. > > Looking at the information built into the compiled Python class, I see > only the original Protobuf package information: > > > > > > > > > > *>>> from google.protobuf.timestamp_pb2 import Timestamp>>> >>> > Timestamp.DESCRIPTOR.file.name > <http://Timestamp.DESCRIPTOR.file.name>'google/protobuf/timestamp.proto'>>> > Timestamp.DESCRIPTOR.file.package'google.protobuf'>>> > Timestamp.DESCRIPTOR.full_name'google.protobuf.Timestamp'* > Note that *google.protobuf.Timestamp* is actually *not* a valid Python > package/module, and therefore it’s not possible (by default) to import > classes based on their declared package names: > > > > *>>> > importlib.import_module(Timestamp.DESCRIPTOR.full_name)ModuleNotFoundError: > No module named 'google.protobuf.Timestamp'* > or the incorrect package is being imported: > > > > *>>> importlib.import_module(Timestamp.DESCRIPTOR.file.package)<module > 'google.protobuf' from > '/path/to/.venv/lib/python3.10/site-packages/google/protobuf/__init__.py'>* > which doesn’t actually contain the *Timestamp* class. That, in turn, > makes it difficult to recursively walk and load nested Protobuf messages in > Python! > > So… what’s the recommendation here for my own Protobuf packages? Should I > name them such that they match the Python package names (and thereby > confuse other languages) or should I stick with Google’s example and skip > the file name in the package declaration (i.e. the Python module)? Does it > matter? > > How do I programmatically walk the compiled Python classes for nested > Protobuf messages? > > Much thanks! > Jens > -- You received this message because you are subscribed to the Google Groups "grpc.io" group. To unsubscribe from this group and stop receiving emails from it, send an email to grpc-io+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/grpc-io/b503042f-d2e9-4952-8023-622a1ec48636n%40googlegroups.com.