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 assert getattr(extension_handle.message_type,
'_concrete_class',
None), (
91 'Uninitialized concrete class found for field %r (message type %r)'
92 % (extension_handle.full_name,
93 extension_handle.message_type.full_name))
94 result = extension_handle.message_type._concrete_class()
97 except ReferenceError:
102 return extension_handle.default_value
111 extension_handle, result)
116 if not isinstance(other, self.__class__):
120 other_fields = other._extended_message.ListFields()
123 my_fields = [field
for field
in my_fields
if field.is_extension]
124 other_fields = [field
for field
in other_fields
if field.is_extension]
126 return my_fields == other_fields
129 return not self == other
134 extension_fields = [field
for field
in fields
if field[0].is_extension]
135 return len(extension_fields)
138 raise TypeError(
'unhashable object')
145 """If extension_handle specifies a non-repeated, scalar extension
146 field, sets the value of that field.
151 if (extension_handle.label == FieldDescriptor.LABEL_REPEATED
or
152 extension_handle.cpp_type == FieldDescriptor.CPPTYPE_MESSAGE):
154 'Cannot assign to extension "%s" because it is a repeated or '
155 'composite type.' % extension_handle.full_name)
159 type_checker = type_checkers.GetTypeChecker(extension_handle)
162 type_checker.CheckValue(value))
166 """Tries to find a known extension with the specified name.
169 name: Extension full name.
172 Extension field descriptor.
177 """Tries to find a known extension with the field number.
180 number: Extension field number.
183 Extension field descriptor.
190 if f[0].is_extension)
198 if extension_handle.label == FieldDescriptor.LABEL_REPEATED:
201 if extension_handle.cpp_type == FieldDescriptor.CPPTYPE_MESSAGE:
204 return value
is not None and value._is_present_in_parent