31 """Contains _ExtensionDict class to represent extensions.
39 """Verify that the given extension handle is valid."""
41 if not isinstance(extension_handle, FieldDescriptor):
42 raise KeyError(
'HasExtension() expects an extension handle, got: %s' %
45 if not extension_handle.is_extension:
46 raise KeyError(
'"%s" is not an extension.' % extension_handle.full_name)
48 if not extension_handle.containing_type:
49 raise KeyError(
'"%s" is missing a containing_type.'
50 % extension_handle.full_name)
52 if extension_handle.containing_type
is not message.DESCRIPTOR:
53 raise KeyError(
'Extension "%s" extends message type "%s", but this '
54 'message is of type "%s".' %
55 (extension_handle.full_name,
56 extension_handle.containing_type.full_name,
57 message.DESCRIPTOR.full_name))
65 """Dict-like container for Extension fields on proto instances.
67 Note that in all cases we expect extension handles to be
74 extended_message: Message instance for which we are the Extensions dict.
79 """Returns the current value of the given extension handle."""
84 if result
is not None:
87 if extension_handle.label == FieldDescriptor.LABEL_REPEATED:
89 elif extension_handle.cpp_type == FieldDescriptor.CPPTYPE_MESSAGE:
90 message_type = extension_handle.message_type
91 if not hasattr(message_type,
'_concrete_class'):
94 assert getattr(extension_handle.message_type,
'_concrete_class',
None), (
95 'Uninitialized concrete class found for field %r (message type %r)'
96 % (extension_handle.full_name,
97 extension_handle.message_type.full_name))
98 result = extension_handle.message_type._concrete_class()
101 except ReferenceError:
106 return extension_handle.default_value
115 extension_handle, result)
120 if not isinstance(other, self.__class__):
124 other_fields = other._extended_message.ListFields()
127 my_fields = [field
for field
in my_fields
if field.is_extension]
128 other_fields = [field
for field
in other_fields
if field.is_extension]
130 return my_fields == other_fields
133 return not self == other
138 extension_fields = [field
for field
in fields
if field[0].is_extension]
139 return len(extension_fields)
142 raise TypeError(
'unhashable object')
149 """If extension_handle specifies a non-repeated, scalar extension
150 field, sets the value of that field.
155 if (extension_handle.label == FieldDescriptor.LABEL_REPEATED
or
156 extension_handle.cpp_type == FieldDescriptor.CPPTYPE_MESSAGE):
158 'Cannot assign to extension "%s" because it is a repeated or '
159 'composite type.' % extension_handle.full_name)
163 type_checker = type_checkers.GetTypeChecker(extension_handle)
166 type_checker.CheckValue(value))
173 """Tries to find a known extension with the specified name.
176 name: Extension full name.
179 Extension field descriptor.
184 """Tries to find a known extension with the field number.
187 number: Extension field number.
190 Extension field descriptor.
197 if f[0].is_extension)
205 if extension_handle.label == FieldDescriptor.LABEL_REPEATED:
208 if extension_handle.cpp_type == FieldDescriptor.CPPTYPE_MESSAGE:
211 return value
is not None and value._is_present_in_parent