Skip to content

Commit 0720536

Browse files
anandoleecopybara-github
authored andcommitted
Breaking change: Python nested message class __qualname__ now contains the outer message name. (Previous __qualname__ has the same result with __name__ for nested message that outer message name was not included)
example: message Foo { message Bar { bool bool_field = 1; } } nested = test_pb2.Foo.Bar() self.assertEqual('Bar', nested.__class__.__name__) self.assertEqual('Foo.Bar', nested.__class__.__qualname__) # It was 'Bar' before PiperOrigin-RevId: 695817876
1 parent a3733ac commit 0720536

File tree

3 files changed

+16
-20
lines changed

3 files changed

+16
-20
lines changed

csharp/src/Google.Protobuf/Reflection/FeatureSetDescriptor.g.cs

-17
This file was deleted.

python/google/protobuf/internal/builder.py

+4-3
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,13 @@ def BuildTopDescriptorsAndMessages(file_des, module_name, module):
5454
module: Generated _pb2 module
5555
"""
5656

57-
def BuildMessage(msg_des):
57+
def BuildMessage(msg_des, prefix):
5858
create_dict = {}
5959
for (name, nested_msg) in msg_des.nested_types_by_name.items():
60-
create_dict[name] = BuildMessage(nested_msg)
60+
create_dict[name] = BuildMessage(nested_msg, prefix + msg_des.name + '.')
6161
create_dict['DESCRIPTOR'] = msg_des
6262
create_dict['__module__'] = module_name
63+
create_dict['__qualname__'] = prefix + msg_des.name
6364
message_class = _reflection.GeneratedProtocolMessageType(
6465
msg_des.name, (_message.Message,), create_dict)
6566
_sym_db.RegisterMessage(message_class)
@@ -83,7 +84,7 @@ def BuildMessage(msg_des):
8384

8485
# Build messages.
8586
for (name, msg_des) in file_des.message_types_by_name.items():
86-
module[name] = BuildMessage(msg_des)
87+
module[name] = BuildMessage(msg_des, '')
8788

8889

8990
def AddHelpersToExtensions(file_des):

python/google/protobuf/internal/message_test.py

+12
Original file line numberDiff line numberDiff line change
@@ -1337,6 +1337,18 @@ def testIn(self, message_module):
13371337
self.assertIn('oneof_bytes', m)
13381338
self.assertNotIn('oneof_string', m)
13391339

1340+
def testMessageClassName(self, message_module):
1341+
m = message_module.TestAllTypes()
1342+
self.assertEqual('TestAllTypes', type(m).__name__)
1343+
self.assertEqual('TestAllTypes', m.__class__.__qualname__)
1344+
1345+
nested = message_module.TestAllTypes.NestedMessage()
1346+
self.assertEqual('NestedMessage', type(nested).__name__)
1347+
self.assertEqual('NestedMessage', nested.__class__.__name__)
1348+
self.assertEqual(
1349+
'TestAllTypes.NestedMessage', nested.__class__.__qualname__
1350+
)
1351+
13401352

13411353
# Class to test proto2-only features (required, extensions, etc.)
13421354
@testing_refleaks.TestCase

0 commit comments

Comments
 (0)