Skip to content

Commit 0de6577

Browse files
Code0x58anandolee
authored andcommitted
Add EnumTypeWrapper.__getattr__ to access values (#5234)
1 parent 05e81cb commit 0de6577

File tree

2 files changed

+40
-0
lines changed

2 files changed

+40
-0
lines changed

python/google/protobuf/internal/enum_type_wrapper.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,3 +87,9 @@ def items(self):
8787
"""
8888
return [(value_descriptor.name, value_descriptor.number)
8989
for value_descriptor in self._enum_type.values]
90+
91+
def __getattr__(self, name):
92+
"""Returns the value coresponding to the given enum name."""
93+
if name in self._enum_type.values_by_name:
94+
return self._enum_type.values_by_name[name].number
95+
raise AttributeError

python/google/protobuf/internal/reflection_test.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -804,30 +804,64 @@ def testEnum_Name(self):
804804
def testEnum_Value(self):
805805
self.assertEqual(unittest_pb2.FOREIGN_FOO,
806806
unittest_pb2.ForeignEnum.Value('FOREIGN_FOO'))
807+
self.assertEqual(unittest_pb2.FOREIGN_FOO,
808+
unittest_pb2.ForeignEnum.FOREIGN_FOO)
809+
807810
self.assertEqual(unittest_pb2.FOREIGN_BAR,
808811
unittest_pb2.ForeignEnum.Value('FOREIGN_BAR'))
812+
self.assertEqual(unittest_pb2.FOREIGN_BAR,
813+
unittest_pb2.ForeignEnum.FOREIGN_BAR)
814+
809815
self.assertEqual(unittest_pb2.FOREIGN_BAZ,
810816
unittest_pb2.ForeignEnum.Value('FOREIGN_BAZ'))
817+
self.assertEqual(unittest_pb2.FOREIGN_BAZ,
818+
unittest_pb2.ForeignEnum.FOREIGN_BAZ)
819+
811820
self.assertRaises(ValueError,
812821
unittest_pb2.ForeignEnum.Value, 'FO')
822+
with self.assertRaises(AttributeError):
823+
unittest_pb2.ForeignEnum.FO
813824

814825
proto = unittest_pb2.TestAllTypes()
815826
self.assertEqual(proto.FOO,
816827
proto.NestedEnum.Value('FOO'))
828+
self.assertEqual(proto.FOO,
829+
proto.NestedEnum.FOO)
830+
817831
self.assertEqual(proto.FOO,
818832
unittest_pb2.TestAllTypes.NestedEnum.Value('FOO'))
833+
self.assertEqual(proto.FOO,
834+
unittest_pb2.TestAllTypes.NestedEnum.FOO)
835+
819836
self.assertEqual(proto.BAR,
820837
proto.NestedEnum.Value('BAR'))
838+
self.assertEqual(proto.BAR,
839+
proto.NestedEnum.BAR)
840+
821841
self.assertEqual(proto.BAR,
822842
unittest_pb2.TestAllTypes.NestedEnum.Value('BAR'))
843+
self.assertEqual(proto.BAR,
844+
unittest_pb2.TestAllTypes.NestedEnum.BAR)
845+
823846
self.assertEqual(proto.BAZ,
824847
proto.NestedEnum.Value('BAZ'))
848+
self.assertEqual(proto.BAZ,
849+
proto.NestedEnum.BAZ)
850+
825851
self.assertEqual(proto.BAZ,
826852
unittest_pb2.TestAllTypes.NestedEnum.Value('BAZ'))
853+
self.assertEqual(proto.BAZ,
854+
unittest_pb2.TestAllTypes.NestedEnum.BAZ)
855+
827856
self.assertRaises(ValueError,
828857
proto.NestedEnum.Value, 'Foo')
858+
with self.assertRaises(AttributeError):
859+
proto.NestedEnum.Value.Foo
860+
829861
self.assertRaises(ValueError,
830862
unittest_pb2.TestAllTypes.NestedEnum.Value, 'Foo')
863+
with self.assertRaises(AttributeError):
864+
unittest_pb2.TestAllTypes.NestedEnum.Value.Foo
831865

832866
def testEnum_KeysAndValues(self):
833867
self.assertEqual(['FOREIGN_FOO', 'FOREIGN_BAR', 'FOREIGN_BAZ'],

0 commit comments

Comments
 (0)