ortools.math_opt.model_update_pb2
@generated by mypy-protobuf. Do not edit manually! isort:skip_file Copyright 2010-2024 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
Updates an existing Model proto.
1# -*- coding: utf-8 -*- 2# Generated by the protocol buffer compiler. DO NOT EDIT! 3# source: ortools/math_opt/model_update.proto 4# Protobuf Python Version: 5.26.1 5"""Generated protocol buffer code.""" 6from google.protobuf import descriptor as _descriptor 7from google.protobuf import descriptor_pool as _descriptor_pool 8from google.protobuf import symbol_database as _symbol_database 9from google.protobuf.internal import builder as _builder 10# @@protoc_insertion_point(imports) 11 12_sym_db = _symbol_database.Default() 13 14 15from ortools.math_opt import model_pb2 as ortools_dot_math__opt_dot_model__pb2 16from ortools.math_opt import sparse_containers_pb2 as ortools_dot_math__opt_dot_sparse__containers__pb2 17 18 19DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n#ortools/math_opt/model_update.proto\x12\x1coperations_research.math_opt\x1a\x1cortools/math_opt/model.proto\x1a(ortools/math_opt/sparse_containers.proto\"\xf7\x01\n\x14VariableUpdatesProto\x12K\n\x0clower_bounds\x18\x01 \x01(\x0b\x32\x35.operations_research.math_opt.SparseDoubleVectorProto\x12K\n\x0cupper_bounds\x18\x02 \x01(\x0b\x32\x35.operations_research.math_opt.SparseDoubleVectorProto\x12\x45\n\x08integers\x18\x03 \x01(\x0b\x32\x33.operations_research.math_opt.SparseBoolVectorProto\"\xd6\x02\n\x15ObjectiveUpdatesProto\x12\x1d\n\x10\x64irection_update\x18\x01 \x01(\x08H\x00\x88\x01\x01\x12\x1a\n\roffset_update\x18\x02 \x01(\x01H\x01\x88\x01\x01\x12R\n\x13linear_coefficients\x18\x03 \x01(\x0b\x32\x35.operations_research.math_opt.SparseDoubleVectorProto\x12U\n\x16quadratic_coefficients\x18\x04 \x01(\x0b\x32\x35.operations_research.math_opt.SparseDoubleMatrixProto\x12\x1c\n\x0fpriority_update\x18\x05 \x01(\x03H\x02\x88\x01\x01\x42\x13\n\x11_direction_updateB\x10\n\x0e_offset_updateB\x12\n\x10_priority_update\"\xec\x03\n\x1f\x41uxiliaryObjectivesUpdatesProto\x12\x1d\n\x15\x64\x65leted_objective_ids\x18\x01 \x03(\x03\x12h\n\x0enew_objectives\x18\x02 \x03(\x0b\x32P.operations_research.math_opt.AuxiliaryObjectivesUpdatesProto.NewObjectivesEntry\x12n\n\x11objective_updates\x18\x03 \x03(\x0b\x32S.operations_research.math_opt.AuxiliaryObjectivesUpdatesProto.ObjectiveUpdatesEntry\x1a\x62\n\x12NewObjectivesEntry\x12\x0b\n\x03key\x18\x01 \x01(\x03\x12;\n\x05value\x18\x02 \x01(\x0b\x32,.operations_research.math_opt.ObjectiveProto:\x02\x38\x01\x1al\n\x15ObjectiveUpdatesEntry\x12\x0b\n\x03key\x18\x01 \x01(\x03\x12\x42\n\x05value\x18\x02 \x01(\x0b\x32\x33.operations_research.math_opt.ObjectiveUpdatesProto:\x02\x38\x01\"\xb8\x01\n\x1cLinearConstraintUpdatesProto\x12K\n\x0clower_bounds\x18\x01 \x01(\x0b\x32\x35.operations_research.math_opt.SparseDoubleVectorProto\x12K\n\x0cupper_bounds\x18\x02 \x01(\x0b\x32\x35.operations_research.math_opt.SparseDoubleVectorProto\"\x9c\x02\n\x1fQuadraticConstraintUpdatesProto\x12\x1e\n\x16\x64\x65leted_constraint_ids\x18\x01 \x03(\x03\x12j\n\x0fnew_constraints\x18\x02 \x03(\x0b\x32Q.operations_research.math_opt.QuadraticConstraintUpdatesProto.NewConstraintsEntry\x1am\n\x13NewConstraintsEntry\x12\x0b\n\x03key\x18\x01 \x01(\x03\x12\x45\n\x05value\x18\x02 \x01(\x0b\x32\x36.operations_research.math_opt.QuadraticConstraintProto:\x02\x38\x01\"\xae\x02\n%SecondOrderConeConstraintUpdatesProto\x12\x1e\n\x16\x64\x65leted_constraint_ids\x18\x01 \x03(\x03\x12p\n\x0fnew_constraints\x18\x02 \x03(\x0b\x32W.operations_research.math_opt.SecondOrderConeConstraintUpdatesProto.NewConstraintsEntry\x1as\n\x13NewConstraintsEntry\x12\x0b\n\x03key\x18\x01 \x01(\x03\x12K\n\x05value\x18\x02 \x01(\x0b\x32<.operations_research.math_opt.SecondOrderConeConstraintProto:\x02\x38\x01\"\x8a\x02\n\x19SosConstraintUpdatesProto\x12\x1e\n\x16\x64\x65leted_constraint_ids\x18\x01 \x03(\x03\x12\x64\n\x0fnew_constraints\x18\x02 \x03(\x0b\x32K.operations_research.math_opt.SosConstraintUpdatesProto.NewConstraintsEntry\x1ag\n\x13NewConstraintsEntry\x12\x0b\n\x03key\x18\x01 \x01(\x03\x12?\n\x05value\x18\x02 \x01(\x0b\x32\x30.operations_research.math_opt.SosConstraintProto:\x02\x38\x01\"\x9c\x02\n\x1fIndicatorConstraintUpdatesProto\x12\x1e\n\x16\x64\x65leted_constraint_ids\x18\x01 \x03(\x03\x12j\n\x0fnew_constraints\x18\x02 \x03(\x0b\x32Q.operations_research.math_opt.IndicatorConstraintUpdatesProto.NewConstraintsEntry\x1am\n\x13NewConstraintsEntry\x12\x0b\n\x03key\x18\x01 \x01(\x03\x12\x45\n\x05value\x18\x02 \x01(\x0b\x32\x36.operations_research.math_opt.IndicatorConstraintProto:\x02\x38\x01\"\xa6\t\n\x10ModelUpdateProto\x12\x1c\n\x14\x64\x65leted_variable_ids\x18\x01 \x03(\x03\x12%\n\x1d\x64\x65leted_linear_constraint_ids\x18\x02 \x03(\x03\x12L\n\x10variable_updates\x18\x03 \x01(\x0b\x32\x32.operations_research.math_opt.VariableUpdatesProto\x12]\n\x19linear_constraint_updates\x18\x04 \x01(\x0b\x32:.operations_research.math_opt.LinearConstraintUpdatesProto\x12\x43\n\rnew_variables\x18\x05 \x01(\x0b\x32,.operations_research.math_opt.VariablesProto\x12T\n\x16new_linear_constraints\x18\x06 \x01(\x0b\x32\x34.operations_research.math_opt.LinearConstraintsProto\x12N\n\x11objective_updates\x18\x07 \x01(\x0b\x32\x33.operations_research.math_opt.ObjectiveUpdatesProto\x12\x63\n\x1c\x61uxiliary_objectives_updates\x18\r \x01(\x0b\x32=.operations_research.math_opt.AuxiliaryObjectivesUpdatesProto\x12_\n linear_constraint_matrix_updates\x18\x08 \x01(\x0b\x32\x35.operations_research.math_opt.SparseDoubleMatrixProto\x12\x63\n\x1cquadratic_constraint_updates\x18\t \x01(\x0b\x32=.operations_research.math_opt.QuadraticConstraintUpdatesProto\x12q\n$second_order_cone_constraint_updates\x18\x0e \x01(\x0b\x32\x43.operations_research.math_opt.SecondOrderConeConstraintUpdatesProto\x12X\n\x17sos1_constraint_updates\x18\n \x01(\x0b\x32\x37.operations_research.math_opt.SosConstraintUpdatesProto\x12X\n\x17sos2_constraint_updates\x18\x0b \x01(\x0b\x32\x37.operations_research.math_opt.SosConstraintUpdatesProto\x12\x63\n\x1cindicator_constraint_updates\x18\x0c \x01(\x0b\x32=.operations_research.math_opt.IndicatorConstraintUpdatesProtoB\x1e\n\x1a\x63om.google.ortools.mathoptP\x01\x62\x06proto3') 20 21_globals = globals() 22_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) 23_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'ortools.math_opt.model_update_pb2', _globals) 24if not _descriptor._USE_C_DESCRIPTORS: 25 _globals['DESCRIPTOR']._loaded_options = None 26 _globals['DESCRIPTOR']._serialized_options = b'\n\032com.google.ortools.mathoptP\001' 27 _globals['_AUXILIARYOBJECTIVESUPDATESPROTO_NEWOBJECTIVESENTRY']._loaded_options = None 28 _globals['_AUXILIARYOBJECTIVESUPDATESPROTO_NEWOBJECTIVESENTRY']._serialized_options = b'8\001' 29 _globals['_AUXILIARYOBJECTIVESUPDATESPROTO_OBJECTIVEUPDATESENTRY']._loaded_options = None 30 _globals['_AUXILIARYOBJECTIVESUPDATESPROTO_OBJECTIVEUPDATESENTRY']._serialized_options = b'8\001' 31 _globals['_QUADRATICCONSTRAINTUPDATESPROTO_NEWCONSTRAINTSENTRY']._loaded_options = None 32 _globals['_QUADRATICCONSTRAINTUPDATESPROTO_NEWCONSTRAINTSENTRY']._serialized_options = b'8\001' 33 _globals['_SECONDORDERCONECONSTRAINTUPDATESPROTO_NEWCONSTRAINTSENTRY']._loaded_options = None 34 _globals['_SECONDORDERCONECONSTRAINTUPDATESPROTO_NEWCONSTRAINTSENTRY']._serialized_options = b'8\001' 35 _globals['_SOSCONSTRAINTUPDATESPROTO_NEWCONSTRAINTSENTRY']._loaded_options = None 36 _globals['_SOSCONSTRAINTUPDATESPROTO_NEWCONSTRAINTSENTRY']._serialized_options = b'8\001' 37 _globals['_INDICATORCONSTRAINTUPDATESPROTO_NEWCONSTRAINTSENTRY']._loaded_options = None 38 _globals['_INDICATORCONSTRAINTUPDATESPROTO_NEWCONSTRAINTSENTRY']._serialized_options = b'8\001' 39 _globals['_VARIABLEUPDATESPROTO']._serialized_start=142 40 _globals['_VARIABLEUPDATESPROTO']._serialized_end=389 41 _globals['_OBJECTIVEUPDATESPROTO']._serialized_start=392 42 _globals['_OBJECTIVEUPDATESPROTO']._serialized_end=734 43 _globals['_AUXILIARYOBJECTIVESUPDATESPROTO']._serialized_start=737 44 _globals['_AUXILIARYOBJECTIVESUPDATESPROTO']._serialized_end=1229 45 _globals['_AUXILIARYOBJECTIVESUPDATESPROTO_NEWOBJECTIVESENTRY']._serialized_start=1021 46 _globals['_AUXILIARYOBJECTIVESUPDATESPROTO_NEWOBJECTIVESENTRY']._serialized_end=1119 47 _globals['_AUXILIARYOBJECTIVESUPDATESPROTO_OBJECTIVEUPDATESENTRY']._serialized_start=1121 48 _globals['_AUXILIARYOBJECTIVESUPDATESPROTO_OBJECTIVEUPDATESENTRY']._serialized_end=1229 49 _globals['_LINEARCONSTRAINTUPDATESPROTO']._serialized_start=1232 50 _globals['_LINEARCONSTRAINTUPDATESPROTO']._serialized_end=1416 51 _globals['_QUADRATICCONSTRAINTUPDATESPROTO']._serialized_start=1419 52 _globals['_QUADRATICCONSTRAINTUPDATESPROTO']._serialized_end=1703 53 _globals['_QUADRATICCONSTRAINTUPDATESPROTO_NEWCONSTRAINTSENTRY']._serialized_start=1594 54 _globals['_QUADRATICCONSTRAINTUPDATESPROTO_NEWCONSTRAINTSENTRY']._serialized_end=1703 55 _globals['_SECONDORDERCONECONSTRAINTUPDATESPROTO']._serialized_start=1706 56 _globals['_SECONDORDERCONECONSTRAINTUPDATESPROTO']._serialized_end=2008 57 _globals['_SECONDORDERCONECONSTRAINTUPDATESPROTO_NEWCONSTRAINTSENTRY']._serialized_start=1893 58 _globals['_SECONDORDERCONECONSTRAINTUPDATESPROTO_NEWCONSTRAINTSENTRY']._serialized_end=2008 59 _globals['_SOSCONSTRAINTUPDATESPROTO']._serialized_start=2011 60 _globals['_SOSCONSTRAINTUPDATESPROTO']._serialized_end=2277 61 _globals['_SOSCONSTRAINTUPDATESPROTO_NEWCONSTRAINTSENTRY']._serialized_start=2174 62 _globals['_SOSCONSTRAINTUPDATESPROTO_NEWCONSTRAINTSENTRY']._serialized_end=2277 63 _globals['_INDICATORCONSTRAINTUPDATESPROTO']._serialized_start=2280 64 _globals['_INDICATORCONSTRAINTUPDATESPROTO']._serialized_end=2564 65 _globals['_INDICATORCONSTRAINTUPDATESPROTO_NEWCONSTRAINTSENTRY']._serialized_start=2455 66 _globals['_INDICATORCONSTRAINTUPDATESPROTO_NEWCONSTRAINTSENTRY']._serialized_end=2564 67 _globals['_MODELUPDATEPROTO']._serialized_start=2567 68 _globals['_MODELUPDATEPROTO']._serialized_end=3757 69# @@protoc_insertion_point(module_scope)
Updates to existing variables in a ModelProto.
Applies only to existing variables in a model, for new variables, see ModelUpdateProto.new_variables.
498 def init(self, **kwargs): 499 self._cached_byte_size = 0 500 self._cached_byte_size_dirty = len(kwargs) > 0 501 self._fields = {} 502 # Contains a mapping from oneof field descriptors to the descriptor 503 # of the currently set field in that oneof field. 504 self._oneofs = {} 505 506 # _unknown_fields is () when empty for efficiency, and will be turned into 507 # a list if fields are added. 508 self._unknown_fields = () 509 self._is_present_in_parent = False 510 self._listener = message_listener_mod.NullMessageListener() 511 self._listener_for_children = _Listener(self) 512 for field_name, field_value in kwargs.items(): 513 field = _GetFieldByName(message_descriptor, field_name) 514 if field is None: 515 raise TypeError('%s() got an unexpected keyword argument "%s"' % 516 (message_descriptor.name, field_name)) 517 if field_value is None: 518 # field=None is the same as no field at all. 519 continue 520 if field.label == _FieldDescriptor.LABEL_REPEATED: 521 field_copy = field._default_constructor(self) 522 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: # Composite 523 if _IsMapField(field): 524 if _IsMessageMapField(field): 525 for key in field_value: 526 field_copy[key].MergeFrom(field_value[key]) 527 else: 528 field_copy.update(field_value) 529 else: 530 for val in field_value: 531 if isinstance(val, dict): 532 field_copy.add(**val) 533 else: 534 field_copy.add().MergeFrom(val) 535 else: # Scalar 536 if field.cpp_type == _FieldDescriptor.CPPTYPE_ENUM: 537 field_value = [_GetIntegerEnumValue(field.enum_type, val) 538 for val in field_value] 539 field_copy.extend(field_value) 540 self._fields[field] = field_copy 541 elif field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 542 field_copy = field._default_constructor(self) 543 new_val = None 544 if isinstance(field_value, message_mod.Message): 545 new_val = field_value 546 elif isinstance(field_value, dict): 547 if field.message_type.full_name == _StructFullTypeName: 548 field_copy.Clear() 549 if len(field_value) == 1 and 'fields' in field_value: 550 try: 551 field_copy.update(field_value) 552 except: 553 # Fall back to init normal message field 554 field_copy.Clear() 555 new_val = field.message_type._concrete_class(**field_value) 556 else: 557 field_copy.update(field_value) 558 else: 559 new_val = field.message_type._concrete_class(**field_value) 560 elif hasattr(field_copy, '_internal_assign'): 561 field_copy._internal_assign(field_value) 562 else: 563 raise TypeError( 564 'Message field {0}.{1} must be initialized with a ' 565 'dict or instance of same class, got {2}.'.format( 566 message_descriptor.name, 567 field_name, 568 type(field_value).__name__, 569 ) 570 ) 571 572 if new_val: 573 try: 574 field_copy.MergeFrom(new_val) 575 except TypeError: 576 _ReraiseTypeErrorWithFieldName(message_descriptor.name, field_name) 577 self._fields[field] = field_copy 578 else: 579 if field.cpp_type == _FieldDescriptor.CPPTYPE_ENUM: 580 field_value = _GetIntegerEnumValue(field.enum_type, field_value) 581 try: 582 setattr(self, field_name, field_value) 583 except TypeError: 584 _ReraiseTypeErrorWithFieldName(message_descriptor.name, field_name)
1361 def MergeFrom(self, msg): 1362 if not isinstance(msg, cls): 1363 raise TypeError( 1364 'Parameter to MergeFrom() must be instance of same class: ' 1365 'expected %s got %s.' % (_FullyQualifiedClassName(cls), 1366 _FullyQualifiedClassName(msg.__class__))) 1367 1368 assert msg is not self 1369 self._Modified() 1370 1371 fields = self._fields 1372 1373 for field, value in msg._fields.items(): 1374 if field.label == LABEL_REPEATED: 1375 field_value = fields.get(field) 1376 if field_value is None: 1377 # Construct a new object to represent this field. 1378 field_value = field._default_constructor(self) 1379 fields[field] = field_value 1380 field_value.MergeFrom(value) 1381 elif field.cpp_type == CPPTYPE_MESSAGE: 1382 if value._is_present_in_parent: 1383 field_value = fields.get(field) 1384 if field_value is None: 1385 # Construct a new object to represent this field. 1386 field_value = field._default_constructor(self) 1387 fields[field] = field_value 1388 field_value.MergeFrom(value) 1389 else: 1390 self._fields[field] = value 1391 if field.containing_oneof: 1392 self._UpdateOneofState(field) 1393 1394 if msg._unknown_fields: 1395 if not self._unknown_fields: 1396 self._unknown_fields = [] 1397 self._unknown_fields.extend(msg._unknown_fields)
Merges the contents of the specified message into current message.
This method merges the contents of the specified message into the current message. Singular fields that are set in the specified message overwrite the corresponding fields in the current message. Repeated fields are appended. Singular sub-messages and groups are recursively merged.
Arguments:
- other_msg (Message): A message to merge into the current message.
1420def _Clear(self): 1421 # Clear fields. 1422 self._fields = {} 1423 self._unknown_fields = () 1424 1425 self._oneofs = {} 1426 self._Modified()
Clears all data that was set in the message.
1486 def Modified(self): 1487 """Sets the _cached_byte_size_dirty bit to true, 1488 and propagates this to our listener iff this was a state change. 1489 """ 1490 1491 # Note: Some callers check _cached_byte_size_dirty before calling 1492 # _Modified() as an extra optimization. So, if this method is ever 1493 # changed such that it does stuff even when _cached_byte_size_dirty is 1494 # already true, the callers need to be updated. 1495 if not self._cached_byte_size_dirty: 1496 self._cached_byte_size_dirty = True 1497 self._listener_for_children.dirty = True 1498 self._is_present_in_parent = True 1499 self._listener.Modified()
Mark this as present in the parent.
This normally happens automatically when you assign a field of a sub-message, but sometimes you want to make the sub-message present while keeping it empty. If you find yourself using this, you may want to reconsider your design.
1262 def IsInitialized(self, errors=None): 1263 """Checks if all required fields of a message are set. 1264 1265 Args: 1266 errors: A list which, if provided, will be populated with the field 1267 paths of all missing required fields. 1268 1269 Returns: 1270 True iff the specified message has all required fields set. 1271 """ 1272 1273 # Performance is critical so we avoid HasField() and ListFields(). 1274 1275 for field in required_fields: 1276 if (field not in self._fields or 1277 (field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE and 1278 not self._fields[field]._is_present_in_parent)): 1279 if errors is not None: 1280 errors.extend(self.FindInitializationErrors()) 1281 return False 1282 1283 for field, value in list(self._fields.items()): # dict can change size! 1284 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 1285 if field.label == _FieldDescriptor.LABEL_REPEATED: 1286 if (field.message_type._is_map_entry): 1287 continue 1288 for element in value: 1289 if not element.IsInitialized(): 1290 if errors is not None: 1291 errors.extend(self.FindInitializationErrors()) 1292 return False 1293 elif value._is_present_in_parent and not value.IsInitialized(): 1294 if errors is not None: 1295 errors.extend(self.FindInitializationErrors()) 1296 return False 1297 1298 return True
Checks if the message is initialized.
Returns:
bool: The method returns True if the message is initialized (i.e. all of its required fields are set).
1177 def MergeFromString(self, serialized): 1178 serialized = memoryview(serialized) 1179 length = len(serialized) 1180 try: 1181 if self._InternalParse(serialized, 0, length) != length: 1182 # The only reason _InternalParse would return early is if it 1183 # encountered an end-group tag. 1184 raise message_mod.DecodeError('Unexpected end-group tag.') 1185 except (IndexError, TypeError): 1186 # Now ord(buf[p:p+1]) == ord('') gets TypeError. 1187 raise message_mod.DecodeError('Truncated message.') 1188 except struct.error as e: 1189 raise message_mod.DecodeError(e) 1190 return length # Return this for legacy reasons.
Merges serialized protocol buffer data into this message.
When we find a field in serialized
that is already present
in this message:
- If it's a "repeated" field, we append to the end of our list.
- Else, if it's a scalar, we overwrite our field.
- Else, (it's a nonrepeated composite), we recursively merge into the existing composite.
Arguments:
- serialized (bytes): Any object that allows us to call
memoryview(serialized)
to access a string of bytes using the buffer interface.
Returns:
int: The number of bytes read from
serialized
. For non-group messages, this will always belen(serialized)
, but for messages which are actually groups, this will generally be less thanlen(serialized)
, since we must stop when we reach anEND_GROUP
tag. Note that if we do stop because of anEND_GROUP
tag, the number of bytes returned does not include the bytes for theEND_GROUP
tag information.
Raises:
- DecodeError: if the input cannot be parsed.
1130 def SerializeToString(self, **kwargs): 1131 # Check if the message has all of its required fields set. 1132 if not self.IsInitialized(): 1133 raise message_mod.EncodeError( 1134 'Message %s is missing required fields: %s' % ( 1135 self.DESCRIPTOR.full_name, ','.join(self.FindInitializationErrors()))) 1136 return self.SerializePartialToString(**kwargs)
Serializes the protocol message to a binary string.
Keyword Args:
deterministic (bool): If true, requests deterministic serialization of the protobuf, with predictable ordering of map keys.
Returns:
A binary string representation of the message if all of the required fields in the message are set (i.e. the message is initialized).
Raises:
- EncodeError: if the message isn't initialized (see
IsInitialized()
).
1143 def SerializePartialToString(self, **kwargs): 1144 out = BytesIO() 1145 self._InternalSerialize(out.write, **kwargs) 1146 return out.getvalue()
Serializes the protocol message to a binary string.
This method is similar to SerializeToString but doesn't check if the message is initialized.
Keyword Args:
deterministic (bool): If true, requests deterministic serialization of the protobuf, with predictable ordering of map keys.
Returns:
bytes: A serialized representation of the partial message.
848 def ListFields(self): 849 all_fields = [item for item in self._fields.items() if _IsPresent(item)] 850 all_fields.sort(key = lambda item: item[0].number) 851 return all_fields
Returns a list of (FieldDescriptor, value) tuples for present fields.
A message field is non-empty if HasField() would return true. A singular primitive field is non-empty if HasField() would return true in proto2 or it is non zero in proto3. A repeated field is non-empty if it contains at least one element. The fields are ordered by field number.
Returns:
list[tuple(FieldDescriptor, value)]: field descriptors and values for all fields in the message which are not empty. The values vary by field type.
872 def HasField(self, field_name): 873 try: 874 field = hassable_fields[field_name] 875 except KeyError as exc: 876 raise ValueError('Protocol message %s has no non-repeated field "%s" ' 877 'nor has presence is not available for this field.' % ( 878 message_descriptor.full_name, field_name)) from exc 879 880 if isinstance(field, descriptor_mod.OneofDescriptor): 881 try: 882 return HasField(self, self._oneofs[field].name) 883 except KeyError: 884 return False 885 else: 886 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 887 value = self._fields.get(field) 888 return value is not None and value._is_present_in_parent 889 else: 890 return field in self._fields
Checks if a certain field is set for the message.
For a oneof group, checks if any field inside is set. Note that if the
field_name is not defined in the message descriptor, ValueError
will
be raised.
Arguments:
- field_name (str): The name of the field to check for presence.
Returns:
bool: Whether a value has been set for the named field.
Raises:
- ValueError: if the
field_name
is not a member of this message.
897 def ClearField(self, field_name): 898 try: 899 field = message_descriptor.fields_by_name[field_name] 900 except KeyError: 901 try: 902 field = message_descriptor.oneofs_by_name[field_name] 903 if field in self._oneofs: 904 field = self._oneofs[field] 905 else: 906 return 907 except KeyError: 908 raise ValueError('Protocol message %s has no "%s" field.' % 909 (message_descriptor.name, field_name)) 910 911 if field in self._fields: 912 # To match the C++ implementation, we need to invalidate iterators 913 # for map fields when ClearField() happens. 914 if hasattr(self._fields[field], 'InvalidateIterators'): 915 self._fields[field].InvalidateIterators() 916 917 # Note: If the field is a sub-message, its listener will still point 918 # at us. That's fine, because the worst than can happen is that it 919 # will call _Modified() and invalidate our byte size. Big deal. 920 del self._fields[field] 921 922 if self._oneofs.get(field.containing_oneof, None) is field: 923 del self._oneofs[field.containing_oneof] 924 925 # Always call _Modified() -- even if nothing was changed, this is 926 # a mutating method, and thus calling it should cause the field to become 927 # present in the parent message. 928 self._Modified()
Clears the contents of a given field.
Inside a oneof group, clears the field set. If the name neither refers to a
defined field or oneof group, ValueError
is raised.
Arguments:
- field_name (str): The name of the field to check for presence.
Raises:
- ValueError: if the
field_name
is not a member of this message.
1403 def WhichOneof(self, oneof_name): 1404 """Returns the name of the currently set field inside a oneof, or None.""" 1405 try: 1406 field = message_descriptor.oneofs_by_name[oneof_name] 1407 except KeyError: 1408 raise ValueError( 1409 'Protocol message has no oneof "%s" field.' % oneof_name) 1410 1411 nested_field = self._oneofs.get(field, None) 1412 if nested_field is not None and self.HasField(nested_field.name): 1413 return nested_field.name 1414 else: 1415 return None
Returns the name of the field that is set inside a oneof group.
If no field is set, returns None.
Arguments:
- oneof_group (str): the name of the oneof group to check.
Returns:
str or None: The name of the group that is set, or None.
Raises:
- ValueError: no group with the given name exists
1435def _DiscardUnknownFields(self): 1436 self._unknown_fields = [] 1437 for field, value in self.ListFields(): 1438 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 1439 if _IsMapField(field): 1440 if _IsMessageMapField(field): 1441 for key in value: 1442 value[key].DiscardUnknownFields() 1443 elif field.label == _FieldDescriptor.LABEL_REPEATED: 1444 for sub_message in value: 1445 sub_message.DiscardUnknownFields() 1446 else: 1447 value.DiscardUnknownFields()
Clears all fields in the UnknownFieldSet
.
This operation is recursive for nested message.
1098 def ByteSize(self): 1099 if not self._cached_byte_size_dirty: 1100 return self._cached_byte_size 1101 1102 size = 0 1103 descriptor = self.DESCRIPTOR 1104 if descriptor._is_map_entry: 1105 # Fields of map entry should always be serialized. 1106 key_field = descriptor.fields_by_name['key'] 1107 _MaybeAddEncoder(cls, key_field) 1108 size = key_field._sizer(self.key) 1109 value_field = descriptor.fields_by_name['value'] 1110 _MaybeAddEncoder(cls, value_field) 1111 size += value_field._sizer(self.value) 1112 else: 1113 for field_descriptor, field_value in self.ListFields(): 1114 _MaybeAddEncoder(cls, field_descriptor) 1115 size += field_descriptor._sizer(field_value) 1116 for tag_bytes, value_bytes in self._unknown_fields: 1117 size += len(tag_bytes) + len(value_bytes) 1118 1119 self._cached_byte_size = size 1120 self._cached_byte_size_dirty = False 1121 self._listener_for_children.dirty = False 1122 return size
Returns the serialized size of this message.
Recursively calls ByteSize() on all contained messages.
Returns:
int: The number of bytes required to serialize this message.
767 def getter(self): 768 field_value = self._fields.get(field) 769 if field_value is None: 770 # Construct a new object to represent this field. 771 field_value = field._default_constructor(self) 772 773 # Atomically check if another thread has preempted us and, if not, swap 774 # in the new object we just created. If someone has preempted us, we 775 # take that object and discard ours. 776 # WARNING: We are relying on setdefault() being atomic. This is true 777 # in CPython but we haven't investigated others. This warning appears 778 # in several other locations in this file. 779 field_value = self._fields.setdefault(field, field_value) 780 return field_value
Updates ModelProto.variables.lower_bounds.
Requirements:
- lower_bounds.ids must be from ModelProto.variables.ids.
- lower_bounds.values must be < infinity.
- Unset values are unchanged.
767 def getter(self): 768 field_value = self._fields.get(field) 769 if field_value is None: 770 # Construct a new object to represent this field. 771 field_value = field._default_constructor(self) 772 773 # Atomically check if another thread has preempted us and, if not, swap 774 # in the new object we just created. If someone has preempted us, we 775 # take that object and discard ours. 776 # WARNING: We are relying on setdefault() being atomic. This is true 777 # in CPython but we haven't investigated others. This warning appears 778 # in several other locations in this file. 779 field_value = self._fields.setdefault(field, field_value) 780 return field_value
Updates ModelProto.variables.upper_bounds.
Requirements:
- upper_bounds.ids must be from ModelProto.variables.ids.
- upper_bounds.values must be > -infinity.
- Unset values are unchanged.
767 def getter(self): 768 field_value = self._fields.get(field) 769 if field_value is None: 770 # Construct a new object to represent this field. 771 field_value = field._default_constructor(self) 772 773 # Atomically check if another thread has preempted us and, if not, swap 774 # in the new object we just created. If someone has preempted us, we 775 # take that object and discard ours. 776 # WARNING: We are relying on setdefault() being atomic. This is true 777 # in CPython but we haven't investigated others. This warning appears 778 # in several other locations in this file. 779 field_value = self._fields.setdefault(field, field_value) 780 return field_value
Updates ModelProto.variables.integers.
Requirements:
- integers.ids must be from ModelProto.variables.ids.
- Unset values are unchanged.
1302 def FindInitializationErrors(self): 1303 """Finds required fields which are not initialized. 1304 1305 Returns: 1306 A list of strings. Each string is a path to an uninitialized field from 1307 the top-level message, e.g. "foo.bar[5].baz". 1308 """ 1309 1310 errors = [] # simplify things 1311 1312 for field in required_fields: 1313 if not self.HasField(field.name): 1314 errors.append(field.name) 1315 1316 for field, value in self.ListFields(): 1317 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 1318 if field.is_extension: 1319 name = '(%s)' % field.full_name 1320 else: 1321 name = field.name 1322 1323 if _IsMapField(field): 1324 if _IsMessageMapField(field): 1325 for key in value: 1326 element = value[key] 1327 prefix = '%s[%s].' % (name, key) 1328 sub_errors = element.FindInitializationErrors() 1329 errors += [prefix + error for error in sub_errors] 1330 else: 1331 # ScalarMaps can't have any initialization errors. 1332 pass 1333 elif field.label == _FieldDescriptor.LABEL_REPEATED: 1334 for i in range(len(value)): 1335 element = value[i] 1336 prefix = '%s[%d].' % (name, i) 1337 sub_errors = element.FindInitializationErrors() 1338 errors += [prefix + error for error in sub_errors] 1339 else: 1340 prefix = name + '.' 1341 sub_errors = value.FindInitializationErrors() 1342 errors += [prefix + error for error in sub_errors] 1343 1344 return errors
Finds required fields which are not initialized.
Returns:
A list of strings. Each string is a path to an uninitialized field from the top-level message, e.g. "foo.bar[5].baz".
Inherited Members
- google.protobuf.message.Message
- CopyFrom
- ParseFromString
- HasExtension
- ClearExtension
- UnknownFields
Updates the objective of a Model, both for existing and new variables.
498 def init(self, **kwargs): 499 self._cached_byte_size = 0 500 self._cached_byte_size_dirty = len(kwargs) > 0 501 self._fields = {} 502 # Contains a mapping from oneof field descriptors to the descriptor 503 # of the currently set field in that oneof field. 504 self._oneofs = {} 505 506 # _unknown_fields is () when empty for efficiency, and will be turned into 507 # a list if fields are added. 508 self._unknown_fields = () 509 self._is_present_in_parent = False 510 self._listener = message_listener_mod.NullMessageListener() 511 self._listener_for_children = _Listener(self) 512 for field_name, field_value in kwargs.items(): 513 field = _GetFieldByName(message_descriptor, field_name) 514 if field is None: 515 raise TypeError('%s() got an unexpected keyword argument "%s"' % 516 (message_descriptor.name, field_name)) 517 if field_value is None: 518 # field=None is the same as no field at all. 519 continue 520 if field.label == _FieldDescriptor.LABEL_REPEATED: 521 field_copy = field._default_constructor(self) 522 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: # Composite 523 if _IsMapField(field): 524 if _IsMessageMapField(field): 525 for key in field_value: 526 field_copy[key].MergeFrom(field_value[key]) 527 else: 528 field_copy.update(field_value) 529 else: 530 for val in field_value: 531 if isinstance(val, dict): 532 field_copy.add(**val) 533 else: 534 field_copy.add().MergeFrom(val) 535 else: # Scalar 536 if field.cpp_type == _FieldDescriptor.CPPTYPE_ENUM: 537 field_value = [_GetIntegerEnumValue(field.enum_type, val) 538 for val in field_value] 539 field_copy.extend(field_value) 540 self._fields[field] = field_copy 541 elif field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 542 field_copy = field._default_constructor(self) 543 new_val = None 544 if isinstance(field_value, message_mod.Message): 545 new_val = field_value 546 elif isinstance(field_value, dict): 547 if field.message_type.full_name == _StructFullTypeName: 548 field_copy.Clear() 549 if len(field_value) == 1 and 'fields' in field_value: 550 try: 551 field_copy.update(field_value) 552 except: 553 # Fall back to init normal message field 554 field_copy.Clear() 555 new_val = field.message_type._concrete_class(**field_value) 556 else: 557 field_copy.update(field_value) 558 else: 559 new_val = field.message_type._concrete_class(**field_value) 560 elif hasattr(field_copy, '_internal_assign'): 561 field_copy._internal_assign(field_value) 562 else: 563 raise TypeError( 564 'Message field {0}.{1} must be initialized with a ' 565 'dict or instance of same class, got {2}.'.format( 566 message_descriptor.name, 567 field_name, 568 type(field_value).__name__, 569 ) 570 ) 571 572 if new_val: 573 try: 574 field_copy.MergeFrom(new_val) 575 except TypeError: 576 _ReraiseTypeErrorWithFieldName(message_descriptor.name, field_name) 577 self._fields[field] = field_copy 578 else: 579 if field.cpp_type == _FieldDescriptor.CPPTYPE_ENUM: 580 field_value = _GetIntegerEnumValue(field.enum_type, field_value) 581 try: 582 setattr(self, field_name, field_value) 583 except TypeError: 584 _ReraiseTypeErrorWithFieldName(message_descriptor.name, field_name)
1361 def MergeFrom(self, msg): 1362 if not isinstance(msg, cls): 1363 raise TypeError( 1364 'Parameter to MergeFrom() must be instance of same class: ' 1365 'expected %s got %s.' % (_FullyQualifiedClassName(cls), 1366 _FullyQualifiedClassName(msg.__class__))) 1367 1368 assert msg is not self 1369 self._Modified() 1370 1371 fields = self._fields 1372 1373 for field, value in msg._fields.items(): 1374 if field.label == LABEL_REPEATED: 1375 field_value = fields.get(field) 1376 if field_value is None: 1377 # Construct a new object to represent this field. 1378 field_value = field._default_constructor(self) 1379 fields[field] = field_value 1380 field_value.MergeFrom(value) 1381 elif field.cpp_type == CPPTYPE_MESSAGE: 1382 if value._is_present_in_parent: 1383 field_value = fields.get(field) 1384 if field_value is None: 1385 # Construct a new object to represent this field. 1386 field_value = field._default_constructor(self) 1387 fields[field] = field_value 1388 field_value.MergeFrom(value) 1389 else: 1390 self._fields[field] = value 1391 if field.containing_oneof: 1392 self._UpdateOneofState(field) 1393 1394 if msg._unknown_fields: 1395 if not self._unknown_fields: 1396 self._unknown_fields = [] 1397 self._unknown_fields.extend(msg._unknown_fields)
Merges the contents of the specified message into current message.
This method merges the contents of the specified message into the current message. Singular fields that are set in the specified message overwrite the corresponding fields in the current message. Repeated fields are appended. Singular sub-messages and groups are recursively merged.
Arguments:
- other_msg (Message): A message to merge into the current message.
1420def _Clear(self): 1421 # Clear fields. 1422 self._fields = {} 1423 self._unknown_fields = () 1424 1425 self._oneofs = {} 1426 self._Modified()
Clears all data that was set in the message.
1486 def Modified(self): 1487 """Sets the _cached_byte_size_dirty bit to true, 1488 and propagates this to our listener iff this was a state change. 1489 """ 1490 1491 # Note: Some callers check _cached_byte_size_dirty before calling 1492 # _Modified() as an extra optimization. So, if this method is ever 1493 # changed such that it does stuff even when _cached_byte_size_dirty is 1494 # already true, the callers need to be updated. 1495 if not self._cached_byte_size_dirty: 1496 self._cached_byte_size_dirty = True 1497 self._listener_for_children.dirty = True 1498 self._is_present_in_parent = True 1499 self._listener.Modified()
Mark this as present in the parent.
This normally happens automatically when you assign a field of a sub-message, but sometimes you want to make the sub-message present while keeping it empty. If you find yourself using this, you may want to reconsider your design.
1262 def IsInitialized(self, errors=None): 1263 """Checks if all required fields of a message are set. 1264 1265 Args: 1266 errors: A list which, if provided, will be populated with the field 1267 paths of all missing required fields. 1268 1269 Returns: 1270 True iff the specified message has all required fields set. 1271 """ 1272 1273 # Performance is critical so we avoid HasField() and ListFields(). 1274 1275 for field in required_fields: 1276 if (field not in self._fields or 1277 (field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE and 1278 not self._fields[field]._is_present_in_parent)): 1279 if errors is not None: 1280 errors.extend(self.FindInitializationErrors()) 1281 return False 1282 1283 for field, value in list(self._fields.items()): # dict can change size! 1284 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 1285 if field.label == _FieldDescriptor.LABEL_REPEATED: 1286 if (field.message_type._is_map_entry): 1287 continue 1288 for element in value: 1289 if not element.IsInitialized(): 1290 if errors is not None: 1291 errors.extend(self.FindInitializationErrors()) 1292 return False 1293 elif value._is_present_in_parent and not value.IsInitialized(): 1294 if errors is not None: 1295 errors.extend(self.FindInitializationErrors()) 1296 return False 1297 1298 return True
Checks if the message is initialized.
Returns:
bool: The method returns True if the message is initialized (i.e. all of its required fields are set).
1177 def MergeFromString(self, serialized): 1178 serialized = memoryview(serialized) 1179 length = len(serialized) 1180 try: 1181 if self._InternalParse(serialized, 0, length) != length: 1182 # The only reason _InternalParse would return early is if it 1183 # encountered an end-group tag. 1184 raise message_mod.DecodeError('Unexpected end-group tag.') 1185 except (IndexError, TypeError): 1186 # Now ord(buf[p:p+1]) == ord('') gets TypeError. 1187 raise message_mod.DecodeError('Truncated message.') 1188 except struct.error as e: 1189 raise message_mod.DecodeError(e) 1190 return length # Return this for legacy reasons.
Merges serialized protocol buffer data into this message.
When we find a field in serialized
that is already present
in this message:
- If it's a "repeated" field, we append to the end of our list.
- Else, if it's a scalar, we overwrite our field.
- Else, (it's a nonrepeated composite), we recursively merge into the existing composite.
Arguments:
- serialized (bytes): Any object that allows us to call
memoryview(serialized)
to access a string of bytes using the buffer interface.
Returns:
int: The number of bytes read from
serialized
. For non-group messages, this will always belen(serialized)
, but for messages which are actually groups, this will generally be less thanlen(serialized)
, since we must stop when we reach anEND_GROUP
tag. Note that if we do stop because of anEND_GROUP
tag, the number of bytes returned does not include the bytes for theEND_GROUP
tag information.
Raises:
- DecodeError: if the input cannot be parsed.
1130 def SerializeToString(self, **kwargs): 1131 # Check if the message has all of its required fields set. 1132 if not self.IsInitialized(): 1133 raise message_mod.EncodeError( 1134 'Message %s is missing required fields: %s' % ( 1135 self.DESCRIPTOR.full_name, ','.join(self.FindInitializationErrors()))) 1136 return self.SerializePartialToString(**kwargs)
Serializes the protocol message to a binary string.
Keyword Args:
deterministic (bool): If true, requests deterministic serialization of the protobuf, with predictable ordering of map keys.
Returns:
A binary string representation of the message if all of the required fields in the message are set (i.e. the message is initialized).
Raises:
- EncodeError: if the message isn't initialized (see
IsInitialized()
).
1143 def SerializePartialToString(self, **kwargs): 1144 out = BytesIO() 1145 self._InternalSerialize(out.write, **kwargs) 1146 return out.getvalue()
Serializes the protocol message to a binary string.
This method is similar to SerializeToString but doesn't check if the message is initialized.
Keyword Args:
deterministic (bool): If true, requests deterministic serialization of the protobuf, with predictable ordering of map keys.
Returns:
bytes: A serialized representation of the partial message.
848 def ListFields(self): 849 all_fields = [item for item in self._fields.items() if _IsPresent(item)] 850 all_fields.sort(key = lambda item: item[0].number) 851 return all_fields
Returns a list of (FieldDescriptor, value) tuples for present fields.
A message field is non-empty if HasField() would return true. A singular primitive field is non-empty if HasField() would return true in proto2 or it is non zero in proto3. A repeated field is non-empty if it contains at least one element. The fields are ordered by field number.
Returns:
list[tuple(FieldDescriptor, value)]: field descriptors and values for all fields in the message which are not empty. The values vary by field type.
872 def HasField(self, field_name): 873 try: 874 field = hassable_fields[field_name] 875 except KeyError as exc: 876 raise ValueError('Protocol message %s has no non-repeated field "%s" ' 877 'nor has presence is not available for this field.' % ( 878 message_descriptor.full_name, field_name)) from exc 879 880 if isinstance(field, descriptor_mod.OneofDescriptor): 881 try: 882 return HasField(self, self._oneofs[field].name) 883 except KeyError: 884 return False 885 else: 886 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 887 value = self._fields.get(field) 888 return value is not None and value._is_present_in_parent 889 else: 890 return field in self._fields
Checks if a certain field is set for the message.
For a oneof group, checks if any field inside is set. Note that if the
field_name is not defined in the message descriptor, ValueError
will
be raised.
Arguments:
- field_name (str): The name of the field to check for presence.
Returns:
bool: Whether a value has been set for the named field.
Raises:
- ValueError: if the
field_name
is not a member of this message.
897 def ClearField(self, field_name): 898 try: 899 field = message_descriptor.fields_by_name[field_name] 900 except KeyError: 901 try: 902 field = message_descriptor.oneofs_by_name[field_name] 903 if field in self._oneofs: 904 field = self._oneofs[field] 905 else: 906 return 907 except KeyError: 908 raise ValueError('Protocol message %s has no "%s" field.' % 909 (message_descriptor.name, field_name)) 910 911 if field in self._fields: 912 # To match the C++ implementation, we need to invalidate iterators 913 # for map fields when ClearField() happens. 914 if hasattr(self._fields[field], 'InvalidateIterators'): 915 self._fields[field].InvalidateIterators() 916 917 # Note: If the field is a sub-message, its listener will still point 918 # at us. That's fine, because the worst than can happen is that it 919 # will call _Modified() and invalidate our byte size. Big deal. 920 del self._fields[field] 921 922 if self._oneofs.get(field.containing_oneof, None) is field: 923 del self._oneofs[field.containing_oneof] 924 925 # Always call _Modified() -- even if nothing was changed, this is 926 # a mutating method, and thus calling it should cause the field to become 927 # present in the parent message. 928 self._Modified()
Clears the contents of a given field.
Inside a oneof group, clears the field set. If the name neither refers to a
defined field or oneof group, ValueError
is raised.
Arguments:
- field_name (str): The name of the field to check for presence.
Raises:
- ValueError: if the
field_name
is not a member of this message.
1403 def WhichOneof(self, oneof_name): 1404 """Returns the name of the currently set field inside a oneof, or None.""" 1405 try: 1406 field = message_descriptor.oneofs_by_name[oneof_name] 1407 except KeyError: 1408 raise ValueError( 1409 'Protocol message has no oneof "%s" field.' % oneof_name) 1410 1411 nested_field = self._oneofs.get(field, None) 1412 if nested_field is not None and self.HasField(nested_field.name): 1413 return nested_field.name 1414 else: 1415 return None
Returns the name of the currently set field inside a oneof, or None.
1435def _DiscardUnknownFields(self): 1436 self._unknown_fields = [] 1437 for field, value in self.ListFields(): 1438 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 1439 if _IsMapField(field): 1440 if _IsMessageMapField(field): 1441 for key in value: 1442 value[key].DiscardUnknownFields() 1443 elif field.label == _FieldDescriptor.LABEL_REPEATED: 1444 for sub_message in value: 1445 sub_message.DiscardUnknownFields() 1446 else: 1447 value.DiscardUnknownFields()
Clears all fields in the UnknownFieldSet
.
This operation is recursive for nested message.
1098 def ByteSize(self): 1099 if not self._cached_byte_size_dirty: 1100 return self._cached_byte_size 1101 1102 size = 0 1103 descriptor = self.DESCRIPTOR 1104 if descriptor._is_map_entry: 1105 # Fields of map entry should always be serialized. 1106 key_field = descriptor.fields_by_name['key'] 1107 _MaybeAddEncoder(cls, key_field) 1108 size = key_field._sizer(self.key) 1109 value_field = descriptor.fields_by_name['value'] 1110 _MaybeAddEncoder(cls, value_field) 1111 size += value_field._sizer(self.value) 1112 else: 1113 for field_descriptor, field_value in self.ListFields(): 1114 _MaybeAddEncoder(cls, field_descriptor) 1115 size += field_descriptor._sizer(field_value) 1116 for tag_bytes, value_bytes in self._unknown_fields: 1117 size += len(tag_bytes) + len(value_bytes) 1118 1119 self._cached_byte_size = size 1120 self._cached_byte_size_dirty = False 1121 self._listener_for_children.dirty = False 1122 return size
Returns the serialized size of this message.
Recursively calls ByteSize() on all contained messages.
Returns:
int: The number of bytes required to serialize this message.
711 def getter(self): 712 # TODO: This may be broken since there may not be 713 # default_value. Combine with has_default_value somehow. 714 return self._fields.get(field, default_value)
Not set indicates no change, false is minimize, true is maximize.
711 def getter(self): 712 # TODO: This may be broken since there may not be 713 # default_value. Combine with has_default_value somehow. 714 return self._fields.get(field, default_value)
Not set indicates not change, otherwise the new offset.
767 def getter(self): 768 field_value = self._fields.get(field) 769 if field_value is None: 770 # Construct a new object to represent this field. 771 field_value = field._default_constructor(self) 772 773 # Atomically check if another thread has preempted us and, if not, swap 774 # in the new object we just created. If someone has preempted us, we 775 # take that object and discard ours. 776 # WARNING: We are relying on setdefault() being atomic. This is true 777 # in CPython but we haven't investigated others. This warning appears 778 # in several other locations in this file. 779 field_value = self._fields.setdefault(field, field_value) 780 return field_value
Updates ObjectiveProto.linear_coefficients.
Requirements:
- linear_coefficients.ids must be variable ids, either existing one (from ModelProto.variables.ids) or new ones (from ModelUpdateProto.new_variables.ids).
- linear_coefficients.values must be finite
- Unset values are unchanged.
- The value 0.0 removes a variable from the linear objective. This value should only be used for existing variables.
767 def getter(self): 768 field_value = self._fields.get(field) 769 if field_value is None: 770 # Construct a new object to represent this field. 771 field_value = field._default_constructor(self) 772 773 # Atomically check if another thread has preempted us and, if not, swap 774 # in the new object we just created. If someone has preempted us, we 775 # take that object and discard ours. 776 # WARNING: We are relying on setdefault() being atomic. This is true 777 # in CPython but we haven't investigated others. This warning appears 778 # in several other locations in this file. 779 field_value = self._fields.setdefault(field, field_value) 780 return field_value
Updates ObjectiveProto.quadratic_coefficients
Requirements in addition to those on SparseDoubleMatrixProto messages:
- Each element of quadratic_coefficients.row_ids and each element of quadratic_coefficients.column_ids must be a variable id, either an existing one (from ModelProto.variables.ids) or a new one (from ModelUpdateProto.new_variables.ids).
- The matrix must be upper triangular: for each i, quadratic_coefficients.row_ids[i] <= quadratic_coefficients.column_ids[i].
Notes:
- Unset values are unchanged.
- The value 0.0 removes a quadratic term (i.e. product of two variables) from the quadratic objective. This value should only be used for existing quadratic terms appearing in the objective.
711 def getter(self): 712 # TODO: This may be broken since there may not be 713 # default_value. Combine with has_default_value somehow. 714 return self._fields.get(field, default_value)
Not set indicates no change, otherwise the new priority. If set, the value must be nonnegative. Furthermore, each objective priority must be distinct at solve time; this condition is not validated at the proto level, so models may temporarily have objectives with the same priority.
1302 def FindInitializationErrors(self): 1303 """Finds required fields which are not initialized. 1304 1305 Returns: 1306 A list of strings. Each string is a path to an uninitialized field from 1307 the top-level message, e.g. "foo.bar[5].baz". 1308 """ 1309 1310 errors = [] # simplify things 1311 1312 for field in required_fields: 1313 if not self.HasField(field.name): 1314 errors.append(field.name) 1315 1316 for field, value in self.ListFields(): 1317 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 1318 if field.is_extension: 1319 name = '(%s)' % field.full_name 1320 else: 1321 name = field.name 1322 1323 if _IsMapField(field): 1324 if _IsMessageMapField(field): 1325 for key in value: 1326 element = value[key] 1327 prefix = '%s[%s].' % (name, key) 1328 sub_errors = element.FindInitializationErrors() 1329 errors += [prefix + error for error in sub_errors] 1330 else: 1331 # ScalarMaps can't have any initialization errors. 1332 pass 1333 elif field.label == _FieldDescriptor.LABEL_REPEATED: 1334 for i in range(len(value)): 1335 element = value[i] 1336 prefix = '%s[%d].' % (name, i) 1337 sub_errors = element.FindInitializationErrors() 1338 errors += [prefix + error for error in sub_errors] 1339 else: 1340 prefix = name + '.' 1341 sub_errors = value.FindInitializationErrors() 1342 errors += [prefix + error for error in sub_errors] 1343 1344 return errors
Finds required fields which are not initialized.
Returns:
A list of strings. Each string is a path to an uninitialized field from the top-level message, e.g. "foo.bar[5].baz".
Inherited Members
- google.protobuf.message.Message
- CopyFrom
- ParseFromString
- HasExtension
- ClearExtension
- UnknownFields
Updates the auxiliary objectives of a Model, both for existing and new variables. Auxiliary objectives can be deleted, added, or modified in place.
498 def init(self, **kwargs): 499 self._cached_byte_size = 0 500 self._cached_byte_size_dirty = len(kwargs) > 0 501 self._fields = {} 502 # Contains a mapping from oneof field descriptors to the descriptor 503 # of the currently set field in that oneof field. 504 self._oneofs = {} 505 506 # _unknown_fields is () when empty for efficiency, and will be turned into 507 # a list if fields are added. 508 self._unknown_fields = () 509 self._is_present_in_parent = False 510 self._listener = message_listener_mod.NullMessageListener() 511 self._listener_for_children = _Listener(self) 512 for field_name, field_value in kwargs.items(): 513 field = _GetFieldByName(message_descriptor, field_name) 514 if field is None: 515 raise TypeError('%s() got an unexpected keyword argument "%s"' % 516 (message_descriptor.name, field_name)) 517 if field_value is None: 518 # field=None is the same as no field at all. 519 continue 520 if field.label == _FieldDescriptor.LABEL_REPEATED: 521 field_copy = field._default_constructor(self) 522 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: # Composite 523 if _IsMapField(field): 524 if _IsMessageMapField(field): 525 for key in field_value: 526 field_copy[key].MergeFrom(field_value[key]) 527 else: 528 field_copy.update(field_value) 529 else: 530 for val in field_value: 531 if isinstance(val, dict): 532 field_copy.add(**val) 533 else: 534 field_copy.add().MergeFrom(val) 535 else: # Scalar 536 if field.cpp_type == _FieldDescriptor.CPPTYPE_ENUM: 537 field_value = [_GetIntegerEnumValue(field.enum_type, val) 538 for val in field_value] 539 field_copy.extend(field_value) 540 self._fields[field] = field_copy 541 elif field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 542 field_copy = field._default_constructor(self) 543 new_val = None 544 if isinstance(field_value, message_mod.Message): 545 new_val = field_value 546 elif isinstance(field_value, dict): 547 if field.message_type.full_name == _StructFullTypeName: 548 field_copy.Clear() 549 if len(field_value) == 1 and 'fields' in field_value: 550 try: 551 field_copy.update(field_value) 552 except: 553 # Fall back to init normal message field 554 field_copy.Clear() 555 new_val = field.message_type._concrete_class(**field_value) 556 else: 557 field_copy.update(field_value) 558 else: 559 new_val = field.message_type._concrete_class(**field_value) 560 elif hasattr(field_copy, '_internal_assign'): 561 field_copy._internal_assign(field_value) 562 else: 563 raise TypeError( 564 'Message field {0}.{1} must be initialized with a ' 565 'dict or instance of same class, got {2}.'.format( 566 message_descriptor.name, 567 field_name, 568 type(field_value).__name__, 569 ) 570 ) 571 572 if new_val: 573 try: 574 field_copy.MergeFrom(new_val) 575 except TypeError: 576 _ReraiseTypeErrorWithFieldName(message_descriptor.name, field_name) 577 self._fields[field] = field_copy 578 else: 579 if field.cpp_type == _FieldDescriptor.CPPTYPE_ENUM: 580 field_value = _GetIntegerEnumValue(field.enum_type, field_value) 581 try: 582 setattr(self, field_name, field_value) 583 except TypeError: 584 _ReraiseTypeErrorWithFieldName(message_descriptor.name, field_name)
1361 def MergeFrom(self, msg): 1362 if not isinstance(msg, cls): 1363 raise TypeError( 1364 'Parameter to MergeFrom() must be instance of same class: ' 1365 'expected %s got %s.' % (_FullyQualifiedClassName(cls), 1366 _FullyQualifiedClassName(msg.__class__))) 1367 1368 assert msg is not self 1369 self._Modified() 1370 1371 fields = self._fields 1372 1373 for field, value in msg._fields.items(): 1374 if field.label == LABEL_REPEATED: 1375 field_value = fields.get(field) 1376 if field_value is None: 1377 # Construct a new object to represent this field. 1378 field_value = field._default_constructor(self) 1379 fields[field] = field_value 1380 field_value.MergeFrom(value) 1381 elif field.cpp_type == CPPTYPE_MESSAGE: 1382 if value._is_present_in_parent: 1383 field_value = fields.get(field) 1384 if field_value is None: 1385 # Construct a new object to represent this field. 1386 field_value = field._default_constructor(self) 1387 fields[field] = field_value 1388 field_value.MergeFrom(value) 1389 else: 1390 self._fields[field] = value 1391 if field.containing_oneof: 1392 self._UpdateOneofState(field) 1393 1394 if msg._unknown_fields: 1395 if not self._unknown_fields: 1396 self._unknown_fields = [] 1397 self._unknown_fields.extend(msg._unknown_fields)
Merges the contents of the specified message into current message.
This method merges the contents of the specified message into the current message. Singular fields that are set in the specified message overwrite the corresponding fields in the current message. Repeated fields are appended. Singular sub-messages and groups are recursively merged.
Arguments:
- other_msg (Message): A message to merge into the current message.
1420def _Clear(self): 1421 # Clear fields. 1422 self._fields = {} 1423 self._unknown_fields = () 1424 1425 self._oneofs = {} 1426 self._Modified()
Clears all data that was set in the message.
1486 def Modified(self): 1487 """Sets the _cached_byte_size_dirty bit to true, 1488 and propagates this to our listener iff this was a state change. 1489 """ 1490 1491 # Note: Some callers check _cached_byte_size_dirty before calling 1492 # _Modified() as an extra optimization. So, if this method is ever 1493 # changed such that it does stuff even when _cached_byte_size_dirty is 1494 # already true, the callers need to be updated. 1495 if not self._cached_byte_size_dirty: 1496 self._cached_byte_size_dirty = True 1497 self._listener_for_children.dirty = True 1498 self._is_present_in_parent = True 1499 self._listener.Modified()
Mark this as present in the parent.
This normally happens automatically when you assign a field of a sub-message, but sometimes you want to make the sub-message present while keeping it empty. If you find yourself using this, you may want to reconsider your design.
1262 def IsInitialized(self, errors=None): 1263 """Checks if all required fields of a message are set. 1264 1265 Args: 1266 errors: A list which, if provided, will be populated with the field 1267 paths of all missing required fields. 1268 1269 Returns: 1270 True iff the specified message has all required fields set. 1271 """ 1272 1273 # Performance is critical so we avoid HasField() and ListFields(). 1274 1275 for field in required_fields: 1276 if (field not in self._fields or 1277 (field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE and 1278 not self._fields[field]._is_present_in_parent)): 1279 if errors is not None: 1280 errors.extend(self.FindInitializationErrors()) 1281 return False 1282 1283 for field, value in list(self._fields.items()): # dict can change size! 1284 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 1285 if field.label == _FieldDescriptor.LABEL_REPEATED: 1286 if (field.message_type._is_map_entry): 1287 continue 1288 for element in value: 1289 if not element.IsInitialized(): 1290 if errors is not None: 1291 errors.extend(self.FindInitializationErrors()) 1292 return False 1293 elif value._is_present_in_parent and not value.IsInitialized(): 1294 if errors is not None: 1295 errors.extend(self.FindInitializationErrors()) 1296 return False 1297 1298 return True
Checks if the message is initialized.
Returns:
bool: The method returns True if the message is initialized (i.e. all of its required fields are set).
1177 def MergeFromString(self, serialized): 1178 serialized = memoryview(serialized) 1179 length = len(serialized) 1180 try: 1181 if self._InternalParse(serialized, 0, length) != length: 1182 # The only reason _InternalParse would return early is if it 1183 # encountered an end-group tag. 1184 raise message_mod.DecodeError('Unexpected end-group tag.') 1185 except (IndexError, TypeError): 1186 # Now ord(buf[p:p+1]) == ord('') gets TypeError. 1187 raise message_mod.DecodeError('Truncated message.') 1188 except struct.error as e: 1189 raise message_mod.DecodeError(e) 1190 return length # Return this for legacy reasons.
Merges serialized protocol buffer data into this message.
When we find a field in serialized
that is already present
in this message:
- If it's a "repeated" field, we append to the end of our list.
- Else, if it's a scalar, we overwrite our field.
- Else, (it's a nonrepeated composite), we recursively merge into the existing composite.
Arguments:
- serialized (bytes): Any object that allows us to call
memoryview(serialized)
to access a string of bytes using the buffer interface.
Returns:
int: The number of bytes read from
serialized
. For non-group messages, this will always belen(serialized)
, but for messages which are actually groups, this will generally be less thanlen(serialized)
, since we must stop when we reach anEND_GROUP
tag. Note that if we do stop because of anEND_GROUP
tag, the number of bytes returned does not include the bytes for theEND_GROUP
tag information.
Raises:
- DecodeError: if the input cannot be parsed.
1130 def SerializeToString(self, **kwargs): 1131 # Check if the message has all of its required fields set. 1132 if not self.IsInitialized(): 1133 raise message_mod.EncodeError( 1134 'Message %s is missing required fields: %s' % ( 1135 self.DESCRIPTOR.full_name, ','.join(self.FindInitializationErrors()))) 1136 return self.SerializePartialToString(**kwargs)
Serializes the protocol message to a binary string.
Keyword Args:
deterministic (bool): If true, requests deterministic serialization of the protobuf, with predictable ordering of map keys.
Returns:
A binary string representation of the message if all of the required fields in the message are set (i.e. the message is initialized).
Raises:
- EncodeError: if the message isn't initialized (see
IsInitialized()
).
1143 def SerializePartialToString(self, **kwargs): 1144 out = BytesIO() 1145 self._InternalSerialize(out.write, **kwargs) 1146 return out.getvalue()
Serializes the protocol message to a binary string.
This method is similar to SerializeToString but doesn't check if the message is initialized.
Keyword Args:
deterministic (bool): If true, requests deterministic serialization of the protobuf, with predictable ordering of map keys.
Returns:
bytes: A serialized representation of the partial message.
848 def ListFields(self): 849 all_fields = [item for item in self._fields.items() if _IsPresent(item)] 850 all_fields.sort(key = lambda item: item[0].number) 851 return all_fields
Returns a list of (FieldDescriptor, value) tuples for present fields.
A message field is non-empty if HasField() would return true. A singular primitive field is non-empty if HasField() would return true in proto2 or it is non zero in proto3. A repeated field is non-empty if it contains at least one element. The fields are ordered by field number.
Returns:
list[tuple(FieldDescriptor, value)]: field descriptors and values for all fields in the message which are not empty. The values vary by field type.
872 def HasField(self, field_name): 873 try: 874 field = hassable_fields[field_name] 875 except KeyError as exc: 876 raise ValueError('Protocol message %s has no non-repeated field "%s" ' 877 'nor has presence is not available for this field.' % ( 878 message_descriptor.full_name, field_name)) from exc 879 880 if isinstance(field, descriptor_mod.OneofDescriptor): 881 try: 882 return HasField(self, self._oneofs[field].name) 883 except KeyError: 884 return False 885 else: 886 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 887 value = self._fields.get(field) 888 return value is not None and value._is_present_in_parent 889 else: 890 return field in self._fields
Checks if a certain field is set for the message.
For a oneof group, checks if any field inside is set. Note that if the
field_name is not defined in the message descriptor, ValueError
will
be raised.
Arguments:
- field_name (str): The name of the field to check for presence.
Returns:
bool: Whether a value has been set for the named field.
Raises:
- ValueError: if the
field_name
is not a member of this message.
897 def ClearField(self, field_name): 898 try: 899 field = message_descriptor.fields_by_name[field_name] 900 except KeyError: 901 try: 902 field = message_descriptor.oneofs_by_name[field_name] 903 if field in self._oneofs: 904 field = self._oneofs[field] 905 else: 906 return 907 except KeyError: 908 raise ValueError('Protocol message %s has no "%s" field.' % 909 (message_descriptor.name, field_name)) 910 911 if field in self._fields: 912 # To match the C++ implementation, we need to invalidate iterators 913 # for map fields when ClearField() happens. 914 if hasattr(self._fields[field], 'InvalidateIterators'): 915 self._fields[field].InvalidateIterators() 916 917 # Note: If the field is a sub-message, its listener will still point 918 # at us. That's fine, because the worst than can happen is that it 919 # will call _Modified() and invalidate our byte size. Big deal. 920 del self._fields[field] 921 922 if self._oneofs.get(field.containing_oneof, None) is field: 923 del self._oneofs[field.containing_oneof] 924 925 # Always call _Modified() -- even if nothing was changed, this is 926 # a mutating method, and thus calling it should cause the field to become 927 # present in the parent message. 928 self._Modified()
Clears the contents of a given field.
Inside a oneof group, clears the field set. If the name neither refers to a
defined field or oneof group, ValueError
is raised.
Arguments:
- field_name (str): The name of the field to check for presence.
Raises:
- ValueError: if the
field_name
is not a member of this message.
1403 def WhichOneof(self, oneof_name): 1404 """Returns the name of the currently set field inside a oneof, or None.""" 1405 try: 1406 field = message_descriptor.oneofs_by_name[oneof_name] 1407 except KeyError: 1408 raise ValueError( 1409 'Protocol message has no oneof "%s" field.' % oneof_name) 1410 1411 nested_field = self._oneofs.get(field, None) 1412 if nested_field is not None and self.HasField(nested_field.name): 1413 return nested_field.name 1414 else: 1415 return None
Returns the name of the field that is set inside a oneof group.
If no field is set, returns None.
Arguments:
- oneof_group (str): the name of the oneof group to check.
Returns:
str or None: The name of the group that is set, or None.
Raises:
- ValueError: no group with the given name exists
1435def _DiscardUnknownFields(self): 1436 self._unknown_fields = [] 1437 for field, value in self.ListFields(): 1438 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 1439 if _IsMapField(field): 1440 if _IsMessageMapField(field): 1441 for key in value: 1442 value[key].DiscardUnknownFields() 1443 elif field.label == _FieldDescriptor.LABEL_REPEATED: 1444 for sub_message in value: 1445 sub_message.DiscardUnknownFields() 1446 else: 1447 value.DiscardUnknownFields()
Clears all fields in the UnknownFieldSet
.
This operation is recursive for nested message.
1098 def ByteSize(self): 1099 if not self._cached_byte_size_dirty: 1100 return self._cached_byte_size 1101 1102 size = 0 1103 descriptor = self.DESCRIPTOR 1104 if descriptor._is_map_entry: 1105 # Fields of map entry should always be serialized. 1106 key_field = descriptor.fields_by_name['key'] 1107 _MaybeAddEncoder(cls, key_field) 1108 size = key_field._sizer(self.key) 1109 value_field = descriptor.fields_by_name['value'] 1110 _MaybeAddEncoder(cls, value_field) 1111 size += value_field._sizer(self.value) 1112 else: 1113 for field_descriptor, field_value in self.ListFields(): 1114 _MaybeAddEncoder(cls, field_descriptor) 1115 size += field_descriptor._sizer(field_value) 1116 for tag_bytes, value_bytes in self._unknown_fields: 1117 size += len(tag_bytes) + len(value_bytes) 1118 1119 self._cached_byte_size = size 1120 self._cached_byte_size_dirty = False 1121 self._listener_for_children.dirty = False 1122 return size
Returns the serialized size of this message.
Recursively calls ByteSize() on all contained messages.
Returns:
int: The number of bytes required to serialize this message.
668 def getter(self): 669 field_value = self._fields.get(field) 670 if field_value is None: 671 # Construct a new object to represent this field. 672 field_value = field._default_constructor(self) 673 674 # Atomically check if another thread has preempted us and, if not, swap 675 # in the new object we just created. If someone has preempted us, we 676 # take that object and discard ours. 677 # WARNING: We are relying on setdefault() being atomic. This is true 678 # in CPython but we haven't investigated others. This warning appears 679 # in several other locations in this file. 680 field_value = self._fields.setdefault(field, field_value) 681 return field_value
Removes auxiliary objectives from the model.
Each value must be in [0, max(int64)). Values must be in strictly increasing order. Applies only to existing auxiliary objective IDs that have not yet been deleted.
668 def getter(self): 669 field_value = self._fields.get(field) 670 if field_value is None: 671 # Construct a new object to represent this field. 672 field_value = field._default_constructor(self) 673 674 # Atomically check if another thread has preempted us and, if not, swap 675 # in the new object we just created. If someone has preempted us, we 676 # take that object and discard ours. 677 # WARNING: We are relying on setdefault() being atomic. This is true 678 # in CPython but we haven't investigated others. This warning appears 679 # in several other locations in this file. 680 field_value = self._fields.setdefault(field, field_value) 681 return field_value
Add new auxiliary objectives to the model. All keys must be in [0, max(int64)), and must be greater than any ids used in the initial model and previous updates. All nonempty names should be distinct from existing names for the primary and other auxiliary objectives.
668 def getter(self): 669 field_value = self._fields.get(field) 670 if field_value is None: 671 # Construct a new object to represent this field. 672 field_value = field._default_constructor(self) 673 674 # Atomically check if another thread has preempted us and, if not, swap 675 # in the new object we just created. If someone has preempted us, we 676 # take that object and discard ours. 677 # WARNING: We are relying on setdefault() being atomic. This is true 678 # in CPython but we haven't investigated others. This warning appears 679 # in several other locations in this file. 680 field_value = self._fields.setdefault(field, field_value) 681 return field_value
Updates existing auxiliary objectives in the model. All key IDs must be
existing in the model and not included in deleted_objective_ids
.
1302 def FindInitializationErrors(self): 1303 """Finds required fields which are not initialized. 1304 1305 Returns: 1306 A list of strings. Each string is a path to an uninitialized field from 1307 the top-level message, e.g. "foo.bar[5].baz". 1308 """ 1309 1310 errors = [] # simplify things 1311 1312 for field in required_fields: 1313 if not self.HasField(field.name): 1314 errors.append(field.name) 1315 1316 for field, value in self.ListFields(): 1317 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 1318 if field.is_extension: 1319 name = '(%s)' % field.full_name 1320 else: 1321 name = field.name 1322 1323 if _IsMapField(field): 1324 if _IsMessageMapField(field): 1325 for key in value: 1326 element = value[key] 1327 prefix = '%s[%s].' % (name, key) 1328 sub_errors = element.FindInitializationErrors() 1329 errors += [prefix + error for error in sub_errors] 1330 else: 1331 # ScalarMaps can't have any initialization errors. 1332 pass 1333 elif field.label == _FieldDescriptor.LABEL_REPEATED: 1334 for i in range(len(value)): 1335 element = value[i] 1336 prefix = '%s[%d].' % (name, i) 1337 sub_errors = element.FindInitializationErrors() 1338 errors += [prefix + error for error in sub_errors] 1339 else: 1340 prefix = name + '.' 1341 sub_errors = value.FindInitializationErrors() 1342 errors += [prefix + error for error in sub_errors] 1343 1344 return errors
Finds required fields which are not initialized.
Returns:
A list of strings. Each string is a path to an uninitialized field from the top-level message, e.g. "foo.bar[5].baz".
Inherited Members
- google.protobuf.message.Message
- CopyFrom
- ParseFromString
- HasExtension
- ClearExtension
- UnknownFields
Abstract base class for protocol messages.
Protocol message classes are almost always generated by the protocol compiler. These generated types subclass Message and implement the methods shown below.
Inherited Members
- NewObjectivesEntry
- NewObjectivesEntry
- DESCRIPTOR
- MergeFrom
- Clear
- SetInParent
- IsInitialized
- MergeFromString
- SerializeToString
- SerializePartialToString
- ListFields
- HasField
- ClearField
- WhichOneof
- DiscardUnknownFields
- ByteSize
- FromString
- KEY_FIELD_NUMBER
- key
- VALUE_FIELD_NUMBER
- value
- FindInitializationErrors
- google.protobuf.message.Message
- CopyFrom
- ParseFromString
- HasExtension
- ClearExtension
- UnknownFields
Abstract base class for protocol messages.
Protocol message classes are almost always generated by the protocol compiler. These generated types subclass Message and implement the methods shown below.
Inherited Members
- ObjectiveUpdatesEntry
- ObjectiveUpdatesEntry
- DESCRIPTOR
- MergeFrom
- Clear
- SetInParent
- IsInitialized
- MergeFromString
- SerializeToString
- SerializePartialToString
- ListFields
- HasField
- ClearField
- WhichOneof
- DiscardUnknownFields
- ByteSize
- FromString
- KEY_FIELD_NUMBER
- key
- VALUE_FIELD_NUMBER
- value
- FindInitializationErrors
- google.protobuf.message.Message
- CopyFrom
- ParseFromString
- HasExtension
- ClearExtension
- UnknownFields
Updates to existing linear constraints in a ModelProto.
498 def init(self, **kwargs): 499 self._cached_byte_size = 0 500 self._cached_byte_size_dirty = len(kwargs) > 0 501 self._fields = {} 502 # Contains a mapping from oneof field descriptors to the descriptor 503 # of the currently set field in that oneof field. 504 self._oneofs = {} 505 506 # _unknown_fields is () when empty for efficiency, and will be turned into 507 # a list if fields are added. 508 self._unknown_fields = () 509 self._is_present_in_parent = False 510 self._listener = message_listener_mod.NullMessageListener() 511 self._listener_for_children = _Listener(self) 512 for field_name, field_value in kwargs.items(): 513 field = _GetFieldByName(message_descriptor, field_name) 514 if field is None: 515 raise TypeError('%s() got an unexpected keyword argument "%s"' % 516 (message_descriptor.name, field_name)) 517 if field_value is None: 518 # field=None is the same as no field at all. 519 continue 520 if field.label == _FieldDescriptor.LABEL_REPEATED: 521 field_copy = field._default_constructor(self) 522 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: # Composite 523 if _IsMapField(field): 524 if _IsMessageMapField(field): 525 for key in field_value: 526 field_copy[key].MergeFrom(field_value[key]) 527 else: 528 field_copy.update(field_value) 529 else: 530 for val in field_value: 531 if isinstance(val, dict): 532 field_copy.add(**val) 533 else: 534 field_copy.add().MergeFrom(val) 535 else: # Scalar 536 if field.cpp_type == _FieldDescriptor.CPPTYPE_ENUM: 537 field_value = [_GetIntegerEnumValue(field.enum_type, val) 538 for val in field_value] 539 field_copy.extend(field_value) 540 self._fields[field] = field_copy 541 elif field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 542 field_copy = field._default_constructor(self) 543 new_val = None 544 if isinstance(field_value, message_mod.Message): 545 new_val = field_value 546 elif isinstance(field_value, dict): 547 if field.message_type.full_name == _StructFullTypeName: 548 field_copy.Clear() 549 if len(field_value) == 1 and 'fields' in field_value: 550 try: 551 field_copy.update(field_value) 552 except: 553 # Fall back to init normal message field 554 field_copy.Clear() 555 new_val = field.message_type._concrete_class(**field_value) 556 else: 557 field_copy.update(field_value) 558 else: 559 new_val = field.message_type._concrete_class(**field_value) 560 elif hasattr(field_copy, '_internal_assign'): 561 field_copy._internal_assign(field_value) 562 else: 563 raise TypeError( 564 'Message field {0}.{1} must be initialized with a ' 565 'dict or instance of same class, got {2}.'.format( 566 message_descriptor.name, 567 field_name, 568 type(field_value).__name__, 569 ) 570 ) 571 572 if new_val: 573 try: 574 field_copy.MergeFrom(new_val) 575 except TypeError: 576 _ReraiseTypeErrorWithFieldName(message_descriptor.name, field_name) 577 self._fields[field] = field_copy 578 else: 579 if field.cpp_type == _FieldDescriptor.CPPTYPE_ENUM: 580 field_value = _GetIntegerEnumValue(field.enum_type, field_value) 581 try: 582 setattr(self, field_name, field_value) 583 except TypeError: 584 _ReraiseTypeErrorWithFieldName(message_descriptor.name, field_name)
1361 def MergeFrom(self, msg): 1362 if not isinstance(msg, cls): 1363 raise TypeError( 1364 'Parameter to MergeFrom() must be instance of same class: ' 1365 'expected %s got %s.' % (_FullyQualifiedClassName(cls), 1366 _FullyQualifiedClassName(msg.__class__))) 1367 1368 assert msg is not self 1369 self._Modified() 1370 1371 fields = self._fields 1372 1373 for field, value in msg._fields.items(): 1374 if field.label == LABEL_REPEATED: 1375 field_value = fields.get(field) 1376 if field_value is None: 1377 # Construct a new object to represent this field. 1378 field_value = field._default_constructor(self) 1379 fields[field] = field_value 1380 field_value.MergeFrom(value) 1381 elif field.cpp_type == CPPTYPE_MESSAGE: 1382 if value._is_present_in_parent: 1383 field_value = fields.get(field) 1384 if field_value is None: 1385 # Construct a new object to represent this field. 1386 field_value = field._default_constructor(self) 1387 fields[field] = field_value 1388 field_value.MergeFrom(value) 1389 else: 1390 self._fields[field] = value 1391 if field.containing_oneof: 1392 self._UpdateOneofState(field) 1393 1394 if msg._unknown_fields: 1395 if not self._unknown_fields: 1396 self._unknown_fields = [] 1397 self._unknown_fields.extend(msg._unknown_fields)
Merges the contents of the specified message into current message.
This method merges the contents of the specified message into the current message. Singular fields that are set in the specified message overwrite the corresponding fields in the current message. Repeated fields are appended. Singular sub-messages and groups are recursively merged.
Arguments:
- other_msg (Message): A message to merge into the current message.
1420def _Clear(self): 1421 # Clear fields. 1422 self._fields = {} 1423 self._unknown_fields = () 1424 1425 self._oneofs = {} 1426 self._Modified()
Clears all data that was set in the message.
1486 def Modified(self): 1487 """Sets the _cached_byte_size_dirty bit to true, 1488 and propagates this to our listener iff this was a state change. 1489 """ 1490 1491 # Note: Some callers check _cached_byte_size_dirty before calling 1492 # _Modified() as an extra optimization. So, if this method is ever 1493 # changed such that it does stuff even when _cached_byte_size_dirty is 1494 # already true, the callers need to be updated. 1495 if not self._cached_byte_size_dirty: 1496 self._cached_byte_size_dirty = True 1497 self._listener_for_children.dirty = True 1498 self._is_present_in_parent = True 1499 self._listener.Modified()
Mark this as present in the parent.
This normally happens automatically when you assign a field of a sub-message, but sometimes you want to make the sub-message present while keeping it empty. If you find yourself using this, you may want to reconsider your design.
1262 def IsInitialized(self, errors=None): 1263 """Checks if all required fields of a message are set. 1264 1265 Args: 1266 errors: A list which, if provided, will be populated with the field 1267 paths of all missing required fields. 1268 1269 Returns: 1270 True iff the specified message has all required fields set. 1271 """ 1272 1273 # Performance is critical so we avoid HasField() and ListFields(). 1274 1275 for field in required_fields: 1276 if (field not in self._fields or 1277 (field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE and 1278 not self._fields[field]._is_present_in_parent)): 1279 if errors is not None: 1280 errors.extend(self.FindInitializationErrors()) 1281 return False 1282 1283 for field, value in list(self._fields.items()): # dict can change size! 1284 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 1285 if field.label == _FieldDescriptor.LABEL_REPEATED: 1286 if (field.message_type._is_map_entry): 1287 continue 1288 for element in value: 1289 if not element.IsInitialized(): 1290 if errors is not None: 1291 errors.extend(self.FindInitializationErrors()) 1292 return False 1293 elif value._is_present_in_parent and not value.IsInitialized(): 1294 if errors is not None: 1295 errors.extend(self.FindInitializationErrors()) 1296 return False 1297 1298 return True
Checks if the message is initialized.
Returns:
bool: The method returns True if the message is initialized (i.e. all of its required fields are set).
1177 def MergeFromString(self, serialized): 1178 serialized = memoryview(serialized) 1179 length = len(serialized) 1180 try: 1181 if self._InternalParse(serialized, 0, length) != length: 1182 # The only reason _InternalParse would return early is if it 1183 # encountered an end-group tag. 1184 raise message_mod.DecodeError('Unexpected end-group tag.') 1185 except (IndexError, TypeError): 1186 # Now ord(buf[p:p+1]) == ord('') gets TypeError. 1187 raise message_mod.DecodeError('Truncated message.') 1188 except struct.error as e: 1189 raise message_mod.DecodeError(e) 1190 return length # Return this for legacy reasons.
Merges serialized protocol buffer data into this message.
When we find a field in serialized
that is already present
in this message:
- If it's a "repeated" field, we append to the end of our list.
- Else, if it's a scalar, we overwrite our field.
- Else, (it's a nonrepeated composite), we recursively merge into the existing composite.
Arguments:
- serialized (bytes): Any object that allows us to call
memoryview(serialized)
to access a string of bytes using the buffer interface.
Returns:
int: The number of bytes read from
serialized
. For non-group messages, this will always belen(serialized)
, but for messages which are actually groups, this will generally be less thanlen(serialized)
, since we must stop when we reach anEND_GROUP
tag. Note that if we do stop because of anEND_GROUP
tag, the number of bytes returned does not include the bytes for theEND_GROUP
tag information.
Raises:
- DecodeError: if the input cannot be parsed.
1130 def SerializeToString(self, **kwargs): 1131 # Check if the message has all of its required fields set. 1132 if not self.IsInitialized(): 1133 raise message_mod.EncodeError( 1134 'Message %s is missing required fields: %s' % ( 1135 self.DESCRIPTOR.full_name, ','.join(self.FindInitializationErrors()))) 1136 return self.SerializePartialToString(**kwargs)
Serializes the protocol message to a binary string.
Keyword Args:
deterministic (bool): If true, requests deterministic serialization of the protobuf, with predictable ordering of map keys.
Returns:
A binary string representation of the message if all of the required fields in the message are set (i.e. the message is initialized).
Raises:
- EncodeError: if the message isn't initialized (see
IsInitialized()
).
1143 def SerializePartialToString(self, **kwargs): 1144 out = BytesIO() 1145 self._InternalSerialize(out.write, **kwargs) 1146 return out.getvalue()
Serializes the protocol message to a binary string.
This method is similar to SerializeToString but doesn't check if the message is initialized.
Keyword Args:
deterministic (bool): If true, requests deterministic serialization of the protobuf, with predictable ordering of map keys.
Returns:
bytes: A serialized representation of the partial message.
848 def ListFields(self): 849 all_fields = [item for item in self._fields.items() if _IsPresent(item)] 850 all_fields.sort(key = lambda item: item[0].number) 851 return all_fields
Returns a list of (FieldDescriptor, value) tuples for present fields.
A message field is non-empty if HasField() would return true. A singular primitive field is non-empty if HasField() would return true in proto2 or it is non zero in proto3. A repeated field is non-empty if it contains at least one element. The fields are ordered by field number.
Returns:
list[tuple(FieldDescriptor, value)]: field descriptors and values for all fields in the message which are not empty. The values vary by field type.
872 def HasField(self, field_name): 873 try: 874 field = hassable_fields[field_name] 875 except KeyError as exc: 876 raise ValueError('Protocol message %s has no non-repeated field "%s" ' 877 'nor has presence is not available for this field.' % ( 878 message_descriptor.full_name, field_name)) from exc 879 880 if isinstance(field, descriptor_mod.OneofDescriptor): 881 try: 882 return HasField(self, self._oneofs[field].name) 883 except KeyError: 884 return False 885 else: 886 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 887 value = self._fields.get(field) 888 return value is not None and value._is_present_in_parent 889 else: 890 return field in self._fields
Checks if a certain field is set for the message.
For a oneof group, checks if any field inside is set. Note that if the
field_name is not defined in the message descriptor, ValueError
will
be raised.
Arguments:
- field_name (str): The name of the field to check for presence.
Returns:
bool: Whether a value has been set for the named field.
Raises:
- ValueError: if the
field_name
is not a member of this message.
897 def ClearField(self, field_name): 898 try: 899 field = message_descriptor.fields_by_name[field_name] 900 except KeyError: 901 try: 902 field = message_descriptor.oneofs_by_name[field_name] 903 if field in self._oneofs: 904 field = self._oneofs[field] 905 else: 906 return 907 except KeyError: 908 raise ValueError('Protocol message %s has no "%s" field.' % 909 (message_descriptor.name, field_name)) 910 911 if field in self._fields: 912 # To match the C++ implementation, we need to invalidate iterators 913 # for map fields when ClearField() happens. 914 if hasattr(self._fields[field], 'InvalidateIterators'): 915 self._fields[field].InvalidateIterators() 916 917 # Note: If the field is a sub-message, its listener will still point 918 # at us. That's fine, because the worst than can happen is that it 919 # will call _Modified() and invalidate our byte size. Big deal. 920 del self._fields[field] 921 922 if self._oneofs.get(field.containing_oneof, None) is field: 923 del self._oneofs[field.containing_oneof] 924 925 # Always call _Modified() -- even if nothing was changed, this is 926 # a mutating method, and thus calling it should cause the field to become 927 # present in the parent message. 928 self._Modified()
Clears the contents of a given field.
Inside a oneof group, clears the field set. If the name neither refers to a
defined field or oneof group, ValueError
is raised.
Arguments:
- field_name (str): The name of the field to check for presence.
Raises:
- ValueError: if the
field_name
is not a member of this message.
1403 def WhichOneof(self, oneof_name): 1404 """Returns the name of the currently set field inside a oneof, or None.""" 1405 try: 1406 field = message_descriptor.oneofs_by_name[oneof_name] 1407 except KeyError: 1408 raise ValueError( 1409 'Protocol message has no oneof "%s" field.' % oneof_name) 1410 1411 nested_field = self._oneofs.get(field, None) 1412 if nested_field is not None and self.HasField(nested_field.name): 1413 return nested_field.name 1414 else: 1415 return None
Returns the name of the field that is set inside a oneof group.
If no field is set, returns None.
Arguments:
- oneof_group (str): the name of the oneof group to check.
Returns:
str or None: The name of the group that is set, or None.
Raises:
- ValueError: no group with the given name exists
1435def _DiscardUnknownFields(self): 1436 self._unknown_fields = [] 1437 for field, value in self.ListFields(): 1438 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 1439 if _IsMapField(field): 1440 if _IsMessageMapField(field): 1441 for key in value: 1442 value[key].DiscardUnknownFields() 1443 elif field.label == _FieldDescriptor.LABEL_REPEATED: 1444 for sub_message in value: 1445 sub_message.DiscardUnknownFields() 1446 else: 1447 value.DiscardUnknownFields()
Clears all fields in the UnknownFieldSet
.
This operation is recursive for nested message.
1098 def ByteSize(self): 1099 if not self._cached_byte_size_dirty: 1100 return self._cached_byte_size 1101 1102 size = 0 1103 descriptor = self.DESCRIPTOR 1104 if descriptor._is_map_entry: 1105 # Fields of map entry should always be serialized. 1106 key_field = descriptor.fields_by_name['key'] 1107 _MaybeAddEncoder(cls, key_field) 1108 size = key_field._sizer(self.key) 1109 value_field = descriptor.fields_by_name['value'] 1110 _MaybeAddEncoder(cls, value_field) 1111 size += value_field._sizer(self.value) 1112 else: 1113 for field_descriptor, field_value in self.ListFields(): 1114 _MaybeAddEncoder(cls, field_descriptor) 1115 size += field_descriptor._sizer(field_value) 1116 for tag_bytes, value_bytes in self._unknown_fields: 1117 size += len(tag_bytes) + len(value_bytes) 1118 1119 self._cached_byte_size = size 1120 self._cached_byte_size_dirty = False 1121 self._listener_for_children.dirty = False 1122 return size
Returns the serialized size of this message.
Recursively calls ByteSize() on all contained messages.
Returns:
int: The number of bytes required to serialize this message.
767 def getter(self): 768 field_value = self._fields.get(field) 769 if field_value is None: 770 # Construct a new object to represent this field. 771 field_value = field._default_constructor(self) 772 773 # Atomically check if another thread has preempted us and, if not, swap 774 # in the new object we just created. If someone has preempted us, we 775 # take that object and discard ours. 776 # WARNING: We are relying on setdefault() being atomic. This is true 777 # in CPython but we haven't investigated others. This warning appears 778 # in several other locations in this file. 779 field_value = self._fields.setdefault(field, field_value) 780 return field_value
Updates ModelProto.linear_constraints.lower_bounds.
Requirements:
- lower_bounds.ids must be from ModelProto.linear_constraints.ids.
- lower_bounds.values must be < infinity.
- Unset values are unchanged.
767 def getter(self): 768 field_value = self._fields.get(field) 769 if field_value is None: 770 # Construct a new object to represent this field. 771 field_value = field._default_constructor(self) 772 773 # Atomically check if another thread has preempted us and, if not, swap 774 # in the new object we just created. If someone has preempted us, we 775 # take that object and discard ours. 776 # WARNING: We are relying on setdefault() being atomic. This is true 777 # in CPython but we haven't investigated others. This warning appears 778 # in several other locations in this file. 779 field_value = self._fields.setdefault(field, field_value) 780 return field_value
Updates ModelProto.linear_constraints.upper_bounds.
Requirements:
- upper_bounds.ids must be from ModelProto.linear_constraints.ids.
- upper_bounds.values must be > -infinity.
- Unset values are unchanged.
1302 def FindInitializationErrors(self): 1303 """Finds required fields which are not initialized. 1304 1305 Returns: 1306 A list of strings. Each string is a path to an uninitialized field from 1307 the top-level message, e.g. "foo.bar[5].baz". 1308 """ 1309 1310 errors = [] # simplify things 1311 1312 for field in required_fields: 1313 if not self.HasField(field.name): 1314 errors.append(field.name) 1315 1316 for field, value in self.ListFields(): 1317 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 1318 if field.is_extension: 1319 name = '(%s)' % field.full_name 1320 else: 1321 name = field.name 1322 1323 if _IsMapField(field): 1324 if _IsMessageMapField(field): 1325 for key in value: 1326 element = value[key] 1327 prefix = '%s[%s].' % (name, key) 1328 sub_errors = element.FindInitializationErrors() 1329 errors += [prefix + error for error in sub_errors] 1330 else: 1331 # ScalarMaps can't have any initialization errors. 1332 pass 1333 elif field.label == _FieldDescriptor.LABEL_REPEATED: 1334 for i in range(len(value)): 1335 element = value[i] 1336 prefix = '%s[%d].' % (name, i) 1337 sub_errors = element.FindInitializationErrors() 1338 errors += [prefix + error for error in sub_errors] 1339 else: 1340 prefix = name + '.' 1341 sub_errors = value.FindInitializationErrors() 1342 errors += [prefix + error for error in sub_errors] 1343 1344 return errors
Finds required fields which are not initialized.
Returns:
A list of strings. Each string is a path to an uninitialized field from the top-level message, e.g. "foo.bar[5].baz".
Inherited Members
- google.protobuf.message.Message
- CopyFrom
- ParseFromString
- HasExtension
- ClearExtension
- UnknownFields
Updates to quadratic constraints; only addition and deletion, no support for in-place constraint updates.
498 def init(self, **kwargs): 499 self._cached_byte_size = 0 500 self._cached_byte_size_dirty = len(kwargs) > 0 501 self._fields = {} 502 # Contains a mapping from oneof field descriptors to the descriptor 503 # of the currently set field in that oneof field. 504 self._oneofs = {} 505 506 # _unknown_fields is () when empty for efficiency, and will be turned into 507 # a list if fields are added. 508 self._unknown_fields = () 509 self._is_present_in_parent = False 510 self._listener = message_listener_mod.NullMessageListener() 511 self._listener_for_children = _Listener(self) 512 for field_name, field_value in kwargs.items(): 513 field = _GetFieldByName(message_descriptor, field_name) 514 if field is None: 515 raise TypeError('%s() got an unexpected keyword argument "%s"' % 516 (message_descriptor.name, field_name)) 517 if field_value is None: 518 # field=None is the same as no field at all. 519 continue 520 if field.label == _FieldDescriptor.LABEL_REPEATED: 521 field_copy = field._default_constructor(self) 522 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: # Composite 523 if _IsMapField(field): 524 if _IsMessageMapField(field): 525 for key in field_value: 526 field_copy[key].MergeFrom(field_value[key]) 527 else: 528 field_copy.update(field_value) 529 else: 530 for val in field_value: 531 if isinstance(val, dict): 532 field_copy.add(**val) 533 else: 534 field_copy.add().MergeFrom(val) 535 else: # Scalar 536 if field.cpp_type == _FieldDescriptor.CPPTYPE_ENUM: 537 field_value = [_GetIntegerEnumValue(field.enum_type, val) 538 for val in field_value] 539 field_copy.extend(field_value) 540 self._fields[field] = field_copy 541 elif field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 542 field_copy = field._default_constructor(self) 543 new_val = None 544 if isinstance(field_value, message_mod.Message): 545 new_val = field_value 546 elif isinstance(field_value, dict): 547 if field.message_type.full_name == _StructFullTypeName: 548 field_copy.Clear() 549 if len(field_value) == 1 and 'fields' in field_value: 550 try: 551 field_copy.update(field_value) 552 except: 553 # Fall back to init normal message field 554 field_copy.Clear() 555 new_val = field.message_type._concrete_class(**field_value) 556 else: 557 field_copy.update(field_value) 558 else: 559 new_val = field.message_type._concrete_class(**field_value) 560 elif hasattr(field_copy, '_internal_assign'): 561 field_copy._internal_assign(field_value) 562 else: 563 raise TypeError( 564 'Message field {0}.{1} must be initialized with a ' 565 'dict or instance of same class, got {2}.'.format( 566 message_descriptor.name, 567 field_name, 568 type(field_value).__name__, 569 ) 570 ) 571 572 if new_val: 573 try: 574 field_copy.MergeFrom(new_val) 575 except TypeError: 576 _ReraiseTypeErrorWithFieldName(message_descriptor.name, field_name) 577 self._fields[field] = field_copy 578 else: 579 if field.cpp_type == _FieldDescriptor.CPPTYPE_ENUM: 580 field_value = _GetIntegerEnumValue(field.enum_type, field_value) 581 try: 582 setattr(self, field_name, field_value) 583 except TypeError: 584 _ReraiseTypeErrorWithFieldName(message_descriptor.name, field_name)
1361 def MergeFrom(self, msg): 1362 if not isinstance(msg, cls): 1363 raise TypeError( 1364 'Parameter to MergeFrom() must be instance of same class: ' 1365 'expected %s got %s.' % (_FullyQualifiedClassName(cls), 1366 _FullyQualifiedClassName(msg.__class__))) 1367 1368 assert msg is not self 1369 self._Modified() 1370 1371 fields = self._fields 1372 1373 for field, value in msg._fields.items(): 1374 if field.label == LABEL_REPEATED: 1375 field_value = fields.get(field) 1376 if field_value is None: 1377 # Construct a new object to represent this field. 1378 field_value = field._default_constructor(self) 1379 fields[field] = field_value 1380 field_value.MergeFrom(value) 1381 elif field.cpp_type == CPPTYPE_MESSAGE: 1382 if value._is_present_in_parent: 1383 field_value = fields.get(field) 1384 if field_value is None: 1385 # Construct a new object to represent this field. 1386 field_value = field._default_constructor(self) 1387 fields[field] = field_value 1388 field_value.MergeFrom(value) 1389 else: 1390 self._fields[field] = value 1391 if field.containing_oneof: 1392 self._UpdateOneofState(field) 1393 1394 if msg._unknown_fields: 1395 if not self._unknown_fields: 1396 self._unknown_fields = [] 1397 self._unknown_fields.extend(msg._unknown_fields)
Merges the contents of the specified message into current message.
This method merges the contents of the specified message into the current message. Singular fields that are set in the specified message overwrite the corresponding fields in the current message. Repeated fields are appended. Singular sub-messages and groups are recursively merged.
Arguments:
- other_msg (Message): A message to merge into the current message.
1420def _Clear(self): 1421 # Clear fields. 1422 self._fields = {} 1423 self._unknown_fields = () 1424 1425 self._oneofs = {} 1426 self._Modified()
Clears all data that was set in the message.
1486 def Modified(self): 1487 """Sets the _cached_byte_size_dirty bit to true, 1488 and propagates this to our listener iff this was a state change. 1489 """ 1490 1491 # Note: Some callers check _cached_byte_size_dirty before calling 1492 # _Modified() as an extra optimization. So, if this method is ever 1493 # changed such that it does stuff even when _cached_byte_size_dirty is 1494 # already true, the callers need to be updated. 1495 if not self._cached_byte_size_dirty: 1496 self._cached_byte_size_dirty = True 1497 self._listener_for_children.dirty = True 1498 self._is_present_in_parent = True 1499 self._listener.Modified()
Mark this as present in the parent.
This normally happens automatically when you assign a field of a sub-message, but sometimes you want to make the sub-message present while keeping it empty. If you find yourself using this, you may want to reconsider your design.
1262 def IsInitialized(self, errors=None): 1263 """Checks if all required fields of a message are set. 1264 1265 Args: 1266 errors: A list which, if provided, will be populated with the field 1267 paths of all missing required fields. 1268 1269 Returns: 1270 True iff the specified message has all required fields set. 1271 """ 1272 1273 # Performance is critical so we avoid HasField() and ListFields(). 1274 1275 for field in required_fields: 1276 if (field not in self._fields or 1277 (field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE and 1278 not self._fields[field]._is_present_in_parent)): 1279 if errors is not None: 1280 errors.extend(self.FindInitializationErrors()) 1281 return False 1282 1283 for field, value in list(self._fields.items()): # dict can change size! 1284 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 1285 if field.label == _FieldDescriptor.LABEL_REPEATED: 1286 if (field.message_type._is_map_entry): 1287 continue 1288 for element in value: 1289 if not element.IsInitialized(): 1290 if errors is not None: 1291 errors.extend(self.FindInitializationErrors()) 1292 return False 1293 elif value._is_present_in_parent and not value.IsInitialized(): 1294 if errors is not None: 1295 errors.extend(self.FindInitializationErrors()) 1296 return False 1297 1298 return True
Checks if the message is initialized.
Returns:
bool: The method returns True if the message is initialized (i.e. all of its required fields are set).
1177 def MergeFromString(self, serialized): 1178 serialized = memoryview(serialized) 1179 length = len(serialized) 1180 try: 1181 if self._InternalParse(serialized, 0, length) != length: 1182 # The only reason _InternalParse would return early is if it 1183 # encountered an end-group tag. 1184 raise message_mod.DecodeError('Unexpected end-group tag.') 1185 except (IndexError, TypeError): 1186 # Now ord(buf[p:p+1]) == ord('') gets TypeError. 1187 raise message_mod.DecodeError('Truncated message.') 1188 except struct.error as e: 1189 raise message_mod.DecodeError(e) 1190 return length # Return this for legacy reasons.
Merges serialized protocol buffer data into this message.
When we find a field in serialized
that is already present
in this message:
- If it's a "repeated" field, we append to the end of our list.
- Else, if it's a scalar, we overwrite our field.
- Else, (it's a nonrepeated composite), we recursively merge into the existing composite.
Arguments:
- serialized (bytes): Any object that allows us to call
memoryview(serialized)
to access a string of bytes using the buffer interface.
Returns:
int: The number of bytes read from
serialized
. For non-group messages, this will always belen(serialized)
, but for messages which are actually groups, this will generally be less thanlen(serialized)
, since we must stop when we reach anEND_GROUP
tag. Note that if we do stop because of anEND_GROUP
tag, the number of bytes returned does not include the bytes for theEND_GROUP
tag information.
Raises:
- DecodeError: if the input cannot be parsed.
1130 def SerializeToString(self, **kwargs): 1131 # Check if the message has all of its required fields set. 1132 if not self.IsInitialized(): 1133 raise message_mod.EncodeError( 1134 'Message %s is missing required fields: %s' % ( 1135 self.DESCRIPTOR.full_name, ','.join(self.FindInitializationErrors()))) 1136 return self.SerializePartialToString(**kwargs)
Serializes the protocol message to a binary string.
Keyword Args:
deterministic (bool): If true, requests deterministic serialization of the protobuf, with predictable ordering of map keys.
Returns:
A binary string representation of the message if all of the required fields in the message are set (i.e. the message is initialized).
Raises:
- EncodeError: if the message isn't initialized (see
IsInitialized()
).
1143 def SerializePartialToString(self, **kwargs): 1144 out = BytesIO() 1145 self._InternalSerialize(out.write, **kwargs) 1146 return out.getvalue()
Serializes the protocol message to a binary string.
This method is similar to SerializeToString but doesn't check if the message is initialized.
Keyword Args:
deterministic (bool): If true, requests deterministic serialization of the protobuf, with predictable ordering of map keys.
Returns:
bytes: A serialized representation of the partial message.
848 def ListFields(self): 849 all_fields = [item for item in self._fields.items() if _IsPresent(item)] 850 all_fields.sort(key = lambda item: item[0].number) 851 return all_fields
Returns a list of (FieldDescriptor, value) tuples for present fields.
A message field is non-empty if HasField() would return true. A singular primitive field is non-empty if HasField() would return true in proto2 or it is non zero in proto3. A repeated field is non-empty if it contains at least one element. The fields are ordered by field number.
Returns:
list[tuple(FieldDescriptor, value)]: field descriptors and values for all fields in the message which are not empty. The values vary by field type.
872 def HasField(self, field_name): 873 try: 874 field = hassable_fields[field_name] 875 except KeyError as exc: 876 raise ValueError('Protocol message %s has no non-repeated field "%s" ' 877 'nor has presence is not available for this field.' % ( 878 message_descriptor.full_name, field_name)) from exc 879 880 if isinstance(field, descriptor_mod.OneofDescriptor): 881 try: 882 return HasField(self, self._oneofs[field].name) 883 except KeyError: 884 return False 885 else: 886 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 887 value = self._fields.get(field) 888 return value is not None and value._is_present_in_parent 889 else: 890 return field in self._fields
Checks if a certain field is set for the message.
For a oneof group, checks if any field inside is set. Note that if the
field_name is not defined in the message descriptor, ValueError
will
be raised.
Arguments:
- field_name (str): The name of the field to check for presence.
Returns:
bool: Whether a value has been set for the named field.
Raises:
- ValueError: if the
field_name
is not a member of this message.
897 def ClearField(self, field_name): 898 try: 899 field = message_descriptor.fields_by_name[field_name] 900 except KeyError: 901 try: 902 field = message_descriptor.oneofs_by_name[field_name] 903 if field in self._oneofs: 904 field = self._oneofs[field] 905 else: 906 return 907 except KeyError: 908 raise ValueError('Protocol message %s has no "%s" field.' % 909 (message_descriptor.name, field_name)) 910 911 if field in self._fields: 912 # To match the C++ implementation, we need to invalidate iterators 913 # for map fields when ClearField() happens. 914 if hasattr(self._fields[field], 'InvalidateIterators'): 915 self._fields[field].InvalidateIterators() 916 917 # Note: If the field is a sub-message, its listener will still point 918 # at us. That's fine, because the worst than can happen is that it 919 # will call _Modified() and invalidate our byte size. Big deal. 920 del self._fields[field] 921 922 if self._oneofs.get(field.containing_oneof, None) is field: 923 del self._oneofs[field.containing_oneof] 924 925 # Always call _Modified() -- even if nothing was changed, this is 926 # a mutating method, and thus calling it should cause the field to become 927 # present in the parent message. 928 self._Modified()
Clears the contents of a given field.
Inside a oneof group, clears the field set. If the name neither refers to a
defined field or oneof group, ValueError
is raised.
Arguments:
- field_name (str): The name of the field to check for presence.
Raises:
- ValueError: if the
field_name
is not a member of this message.
1403 def WhichOneof(self, oneof_name): 1404 """Returns the name of the currently set field inside a oneof, or None.""" 1405 try: 1406 field = message_descriptor.oneofs_by_name[oneof_name] 1407 except KeyError: 1408 raise ValueError( 1409 'Protocol message has no oneof "%s" field.' % oneof_name) 1410 1411 nested_field = self._oneofs.get(field, None) 1412 if nested_field is not None and self.HasField(nested_field.name): 1413 return nested_field.name 1414 else: 1415 return None
Returns the name of the field that is set inside a oneof group.
If no field is set, returns None.
Arguments:
- oneof_group (str): the name of the oneof group to check.
Returns:
str or None: The name of the group that is set, or None.
Raises:
- ValueError: no group with the given name exists
1435def _DiscardUnknownFields(self): 1436 self._unknown_fields = [] 1437 for field, value in self.ListFields(): 1438 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 1439 if _IsMapField(field): 1440 if _IsMessageMapField(field): 1441 for key in value: 1442 value[key].DiscardUnknownFields() 1443 elif field.label == _FieldDescriptor.LABEL_REPEATED: 1444 for sub_message in value: 1445 sub_message.DiscardUnknownFields() 1446 else: 1447 value.DiscardUnknownFields()
Clears all fields in the UnknownFieldSet
.
This operation is recursive for nested message.
1098 def ByteSize(self): 1099 if not self._cached_byte_size_dirty: 1100 return self._cached_byte_size 1101 1102 size = 0 1103 descriptor = self.DESCRIPTOR 1104 if descriptor._is_map_entry: 1105 # Fields of map entry should always be serialized. 1106 key_field = descriptor.fields_by_name['key'] 1107 _MaybeAddEncoder(cls, key_field) 1108 size = key_field._sizer(self.key) 1109 value_field = descriptor.fields_by_name['value'] 1110 _MaybeAddEncoder(cls, value_field) 1111 size += value_field._sizer(self.value) 1112 else: 1113 for field_descriptor, field_value in self.ListFields(): 1114 _MaybeAddEncoder(cls, field_descriptor) 1115 size += field_descriptor._sizer(field_value) 1116 for tag_bytes, value_bytes in self._unknown_fields: 1117 size += len(tag_bytes) + len(value_bytes) 1118 1119 self._cached_byte_size = size 1120 self._cached_byte_size_dirty = False 1121 self._listener_for_children.dirty = False 1122 return size
Returns the serialized size of this message.
Recursively calls ByteSize() on all contained messages.
Returns:
int: The number of bytes required to serialize this message.
668 def getter(self): 669 field_value = self._fields.get(field) 670 if field_value is None: 671 # Construct a new object to represent this field. 672 field_value = field._default_constructor(self) 673 674 # Atomically check if another thread has preempted us and, if not, swap 675 # in the new object we just created. If someone has preempted us, we 676 # take that object and discard ours. 677 # WARNING: We are relying on setdefault() being atomic. This is true 678 # in CPython but we haven't investigated others. This warning appears 679 # in several other locations in this file. 680 field_value = self._fields.setdefault(field, field_value) 681 return field_value
Removes quadratic constraints from the model.
Each value must be in [0, max(int64)). Values must be in strictly increasing order. Applies only to existing quadratic constraint ids that have not yet been deleted.
668 def getter(self): 669 field_value = self._fields.get(field) 670 if field_value is None: 671 # Construct a new object to represent this field. 672 field_value = field._default_constructor(self) 673 674 # Atomically check if another thread has preempted us and, if not, swap 675 # in the new object we just created. If someone has preempted us, we 676 # take that object and discard ours. 677 # WARNING: We are relying on setdefault() being atomic. This is true 678 # in CPython but we haven't investigated others. This warning appears 679 # in several other locations in this file. 680 field_value = self._fields.setdefault(field, field_value) 681 return field_value
Add new quadratic constraints to the model. All keys must be in [0, max(int64)), and must be greater than any ids used in the initial model and previous updates. All nonempty names should be distinct from existing names and each other.
1302 def FindInitializationErrors(self): 1303 """Finds required fields which are not initialized. 1304 1305 Returns: 1306 A list of strings. Each string is a path to an uninitialized field from 1307 the top-level message, e.g. "foo.bar[5].baz". 1308 """ 1309 1310 errors = [] # simplify things 1311 1312 for field in required_fields: 1313 if not self.HasField(field.name): 1314 errors.append(field.name) 1315 1316 for field, value in self.ListFields(): 1317 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 1318 if field.is_extension: 1319 name = '(%s)' % field.full_name 1320 else: 1321 name = field.name 1322 1323 if _IsMapField(field): 1324 if _IsMessageMapField(field): 1325 for key in value: 1326 element = value[key] 1327 prefix = '%s[%s].' % (name, key) 1328 sub_errors = element.FindInitializationErrors() 1329 errors += [prefix + error for error in sub_errors] 1330 else: 1331 # ScalarMaps can't have any initialization errors. 1332 pass 1333 elif field.label == _FieldDescriptor.LABEL_REPEATED: 1334 for i in range(len(value)): 1335 element = value[i] 1336 prefix = '%s[%d].' % (name, i) 1337 sub_errors = element.FindInitializationErrors() 1338 errors += [prefix + error for error in sub_errors] 1339 else: 1340 prefix = name + '.' 1341 sub_errors = value.FindInitializationErrors() 1342 errors += [prefix + error for error in sub_errors] 1343 1344 return errors
Finds required fields which are not initialized.
Returns:
A list of strings. Each string is a path to an uninitialized field from the top-level message, e.g. "foo.bar[5].baz".
Inherited Members
- google.protobuf.message.Message
- CopyFrom
- ParseFromString
- HasExtension
- ClearExtension
- UnknownFields
Abstract base class for protocol messages.
Protocol message classes are almost always generated by the protocol compiler. These generated types subclass Message and implement the methods shown below.
Inherited Members
- NewConstraintsEntry
- NewConstraintsEntry
- DESCRIPTOR
- MergeFrom
- Clear
- SetInParent
- IsInitialized
- MergeFromString
- SerializeToString
- SerializePartialToString
- ListFields
- HasField
- ClearField
- WhichOneof
- DiscardUnknownFields
- ByteSize
- FromString
- KEY_FIELD_NUMBER
- key
- VALUE_FIELD_NUMBER
- value
- FindInitializationErrors
- google.protobuf.message.Message
- CopyFrom
- ParseFromString
- HasExtension
- ClearExtension
- UnknownFields
Updates to second-order cone constraints; only addition and deletion, no support for in-place constraint updates.
498 def init(self, **kwargs): 499 self._cached_byte_size = 0 500 self._cached_byte_size_dirty = len(kwargs) > 0 501 self._fields = {} 502 # Contains a mapping from oneof field descriptors to the descriptor 503 # of the currently set field in that oneof field. 504 self._oneofs = {} 505 506 # _unknown_fields is () when empty for efficiency, and will be turned into 507 # a list if fields are added. 508 self._unknown_fields = () 509 self._is_present_in_parent = False 510 self._listener = message_listener_mod.NullMessageListener() 511 self._listener_for_children = _Listener(self) 512 for field_name, field_value in kwargs.items(): 513 field = _GetFieldByName(message_descriptor, field_name) 514 if field is None: 515 raise TypeError('%s() got an unexpected keyword argument "%s"' % 516 (message_descriptor.name, field_name)) 517 if field_value is None: 518 # field=None is the same as no field at all. 519 continue 520 if field.label == _FieldDescriptor.LABEL_REPEATED: 521 field_copy = field._default_constructor(self) 522 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: # Composite 523 if _IsMapField(field): 524 if _IsMessageMapField(field): 525 for key in field_value: 526 field_copy[key].MergeFrom(field_value[key]) 527 else: 528 field_copy.update(field_value) 529 else: 530 for val in field_value: 531 if isinstance(val, dict): 532 field_copy.add(**val) 533 else: 534 field_copy.add().MergeFrom(val) 535 else: # Scalar 536 if field.cpp_type == _FieldDescriptor.CPPTYPE_ENUM: 537 field_value = [_GetIntegerEnumValue(field.enum_type, val) 538 for val in field_value] 539 field_copy.extend(field_value) 540 self._fields[field] = field_copy 541 elif field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 542 field_copy = field._default_constructor(self) 543 new_val = None 544 if isinstance(field_value, message_mod.Message): 545 new_val = field_value 546 elif isinstance(field_value, dict): 547 if field.message_type.full_name == _StructFullTypeName: 548 field_copy.Clear() 549 if len(field_value) == 1 and 'fields' in field_value: 550 try: 551 field_copy.update(field_value) 552 except: 553 # Fall back to init normal message field 554 field_copy.Clear() 555 new_val = field.message_type._concrete_class(**field_value) 556 else: 557 field_copy.update(field_value) 558 else: 559 new_val = field.message_type._concrete_class(**field_value) 560 elif hasattr(field_copy, '_internal_assign'): 561 field_copy._internal_assign(field_value) 562 else: 563 raise TypeError( 564 'Message field {0}.{1} must be initialized with a ' 565 'dict or instance of same class, got {2}.'.format( 566 message_descriptor.name, 567 field_name, 568 type(field_value).__name__, 569 ) 570 ) 571 572 if new_val: 573 try: 574 field_copy.MergeFrom(new_val) 575 except TypeError: 576 _ReraiseTypeErrorWithFieldName(message_descriptor.name, field_name) 577 self._fields[field] = field_copy 578 else: 579 if field.cpp_type == _FieldDescriptor.CPPTYPE_ENUM: 580 field_value = _GetIntegerEnumValue(field.enum_type, field_value) 581 try: 582 setattr(self, field_name, field_value) 583 except TypeError: 584 _ReraiseTypeErrorWithFieldName(message_descriptor.name, field_name)
1361 def MergeFrom(self, msg): 1362 if not isinstance(msg, cls): 1363 raise TypeError( 1364 'Parameter to MergeFrom() must be instance of same class: ' 1365 'expected %s got %s.' % (_FullyQualifiedClassName(cls), 1366 _FullyQualifiedClassName(msg.__class__))) 1367 1368 assert msg is not self 1369 self._Modified() 1370 1371 fields = self._fields 1372 1373 for field, value in msg._fields.items(): 1374 if field.label == LABEL_REPEATED: 1375 field_value = fields.get(field) 1376 if field_value is None: 1377 # Construct a new object to represent this field. 1378 field_value = field._default_constructor(self) 1379 fields[field] = field_value 1380 field_value.MergeFrom(value) 1381 elif field.cpp_type == CPPTYPE_MESSAGE: 1382 if value._is_present_in_parent: 1383 field_value = fields.get(field) 1384 if field_value is None: 1385 # Construct a new object to represent this field. 1386 field_value = field._default_constructor(self) 1387 fields[field] = field_value 1388 field_value.MergeFrom(value) 1389 else: 1390 self._fields[field] = value 1391 if field.containing_oneof: 1392 self._UpdateOneofState(field) 1393 1394 if msg._unknown_fields: 1395 if not self._unknown_fields: 1396 self._unknown_fields = [] 1397 self._unknown_fields.extend(msg._unknown_fields)
Merges the contents of the specified message into current message.
This method merges the contents of the specified message into the current message. Singular fields that are set in the specified message overwrite the corresponding fields in the current message. Repeated fields are appended. Singular sub-messages and groups are recursively merged.
Arguments:
- other_msg (Message): A message to merge into the current message.
1420def _Clear(self): 1421 # Clear fields. 1422 self._fields = {} 1423 self._unknown_fields = () 1424 1425 self._oneofs = {} 1426 self._Modified()
Clears all data that was set in the message.
1486 def Modified(self): 1487 """Sets the _cached_byte_size_dirty bit to true, 1488 and propagates this to our listener iff this was a state change. 1489 """ 1490 1491 # Note: Some callers check _cached_byte_size_dirty before calling 1492 # _Modified() as an extra optimization. So, if this method is ever 1493 # changed such that it does stuff even when _cached_byte_size_dirty is 1494 # already true, the callers need to be updated. 1495 if not self._cached_byte_size_dirty: 1496 self._cached_byte_size_dirty = True 1497 self._listener_for_children.dirty = True 1498 self._is_present_in_parent = True 1499 self._listener.Modified()
Mark this as present in the parent.
This normally happens automatically when you assign a field of a sub-message, but sometimes you want to make the sub-message present while keeping it empty. If you find yourself using this, you may want to reconsider your design.
1262 def IsInitialized(self, errors=None): 1263 """Checks if all required fields of a message are set. 1264 1265 Args: 1266 errors: A list which, if provided, will be populated with the field 1267 paths of all missing required fields. 1268 1269 Returns: 1270 True iff the specified message has all required fields set. 1271 """ 1272 1273 # Performance is critical so we avoid HasField() and ListFields(). 1274 1275 for field in required_fields: 1276 if (field not in self._fields or 1277 (field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE and 1278 not self._fields[field]._is_present_in_parent)): 1279 if errors is not None: 1280 errors.extend(self.FindInitializationErrors()) 1281 return False 1282 1283 for field, value in list(self._fields.items()): # dict can change size! 1284 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 1285 if field.label == _FieldDescriptor.LABEL_REPEATED: 1286 if (field.message_type._is_map_entry): 1287 continue 1288 for element in value: 1289 if not element.IsInitialized(): 1290 if errors is not None: 1291 errors.extend(self.FindInitializationErrors()) 1292 return False 1293 elif value._is_present_in_parent and not value.IsInitialized(): 1294 if errors is not None: 1295 errors.extend(self.FindInitializationErrors()) 1296 return False 1297 1298 return True
Checks if the message is initialized.
Returns:
bool: The method returns True if the message is initialized (i.e. all of its required fields are set).
1177 def MergeFromString(self, serialized): 1178 serialized = memoryview(serialized) 1179 length = len(serialized) 1180 try: 1181 if self._InternalParse(serialized, 0, length) != length: 1182 # The only reason _InternalParse would return early is if it 1183 # encountered an end-group tag. 1184 raise message_mod.DecodeError('Unexpected end-group tag.') 1185 except (IndexError, TypeError): 1186 # Now ord(buf[p:p+1]) == ord('') gets TypeError. 1187 raise message_mod.DecodeError('Truncated message.') 1188 except struct.error as e: 1189 raise message_mod.DecodeError(e) 1190 return length # Return this for legacy reasons.
Merges serialized protocol buffer data into this message.
When we find a field in serialized
that is already present
in this message:
- If it's a "repeated" field, we append to the end of our list.
- Else, if it's a scalar, we overwrite our field.
- Else, (it's a nonrepeated composite), we recursively merge into the existing composite.
Arguments:
- serialized (bytes): Any object that allows us to call
memoryview(serialized)
to access a string of bytes using the buffer interface.
Returns:
int: The number of bytes read from
serialized
. For non-group messages, this will always belen(serialized)
, but for messages which are actually groups, this will generally be less thanlen(serialized)
, since we must stop when we reach anEND_GROUP
tag. Note that if we do stop because of anEND_GROUP
tag, the number of bytes returned does not include the bytes for theEND_GROUP
tag information.
Raises:
- DecodeError: if the input cannot be parsed.
1130 def SerializeToString(self, **kwargs): 1131 # Check if the message has all of its required fields set. 1132 if not self.IsInitialized(): 1133 raise message_mod.EncodeError( 1134 'Message %s is missing required fields: %s' % ( 1135 self.DESCRIPTOR.full_name, ','.join(self.FindInitializationErrors()))) 1136 return self.SerializePartialToString(**kwargs)
Serializes the protocol message to a binary string.
Keyword Args:
deterministic (bool): If true, requests deterministic serialization of the protobuf, with predictable ordering of map keys.
Returns:
A binary string representation of the message if all of the required fields in the message are set (i.e. the message is initialized).
Raises:
- EncodeError: if the message isn't initialized (see
IsInitialized()
).
1143 def SerializePartialToString(self, **kwargs): 1144 out = BytesIO() 1145 self._InternalSerialize(out.write, **kwargs) 1146 return out.getvalue()
Serializes the protocol message to a binary string.
This method is similar to SerializeToString but doesn't check if the message is initialized.
Keyword Args:
deterministic (bool): If true, requests deterministic serialization of the protobuf, with predictable ordering of map keys.
Returns:
bytes: A serialized representation of the partial message.
848 def ListFields(self): 849 all_fields = [item for item in self._fields.items() if _IsPresent(item)] 850 all_fields.sort(key = lambda item: item[0].number) 851 return all_fields
Returns a list of (FieldDescriptor, value) tuples for present fields.
A message field is non-empty if HasField() would return true. A singular primitive field is non-empty if HasField() would return true in proto2 or it is non zero in proto3. A repeated field is non-empty if it contains at least one element. The fields are ordered by field number.
Returns:
list[tuple(FieldDescriptor, value)]: field descriptors and values for all fields in the message which are not empty. The values vary by field type.
872 def HasField(self, field_name): 873 try: 874 field = hassable_fields[field_name] 875 except KeyError as exc: 876 raise ValueError('Protocol message %s has no non-repeated field "%s" ' 877 'nor has presence is not available for this field.' % ( 878 message_descriptor.full_name, field_name)) from exc 879 880 if isinstance(field, descriptor_mod.OneofDescriptor): 881 try: 882 return HasField(self, self._oneofs[field].name) 883 except KeyError: 884 return False 885 else: 886 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 887 value = self._fields.get(field) 888 return value is not None and value._is_present_in_parent 889 else: 890 return field in self._fields
Checks if a certain field is set for the message.
For a oneof group, checks if any field inside is set. Note that if the
field_name is not defined in the message descriptor, ValueError
will
be raised.
Arguments:
- field_name (str): The name of the field to check for presence.
Returns:
bool: Whether a value has been set for the named field.
Raises:
- ValueError: if the
field_name
is not a member of this message.
897 def ClearField(self, field_name): 898 try: 899 field = message_descriptor.fields_by_name[field_name] 900 except KeyError: 901 try: 902 field = message_descriptor.oneofs_by_name[field_name] 903 if field in self._oneofs: 904 field = self._oneofs[field] 905 else: 906 return 907 except KeyError: 908 raise ValueError('Protocol message %s has no "%s" field.' % 909 (message_descriptor.name, field_name)) 910 911 if field in self._fields: 912 # To match the C++ implementation, we need to invalidate iterators 913 # for map fields when ClearField() happens. 914 if hasattr(self._fields[field], 'InvalidateIterators'): 915 self._fields[field].InvalidateIterators() 916 917 # Note: If the field is a sub-message, its listener will still point 918 # at us. That's fine, because the worst than can happen is that it 919 # will call _Modified() and invalidate our byte size. Big deal. 920 del self._fields[field] 921 922 if self._oneofs.get(field.containing_oneof, None) is field: 923 del self._oneofs[field.containing_oneof] 924 925 # Always call _Modified() -- even if nothing was changed, this is 926 # a mutating method, and thus calling it should cause the field to become 927 # present in the parent message. 928 self._Modified()
Clears the contents of a given field.
Inside a oneof group, clears the field set. If the name neither refers to a
defined field or oneof group, ValueError
is raised.
Arguments:
- field_name (str): The name of the field to check for presence.
Raises:
- ValueError: if the
field_name
is not a member of this message.
1403 def WhichOneof(self, oneof_name): 1404 """Returns the name of the currently set field inside a oneof, or None.""" 1405 try: 1406 field = message_descriptor.oneofs_by_name[oneof_name] 1407 except KeyError: 1408 raise ValueError( 1409 'Protocol message has no oneof "%s" field.' % oneof_name) 1410 1411 nested_field = self._oneofs.get(field, None) 1412 if nested_field is not None and self.HasField(nested_field.name): 1413 return nested_field.name 1414 else: 1415 return None
Returns the name of the field that is set inside a oneof group.
If no field is set, returns None.
Arguments:
- oneof_group (str): the name of the oneof group to check.
Returns:
str or None: The name of the group that is set, or None.
Raises:
- ValueError: no group with the given name exists
1435def _DiscardUnknownFields(self): 1436 self._unknown_fields = [] 1437 for field, value in self.ListFields(): 1438 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 1439 if _IsMapField(field): 1440 if _IsMessageMapField(field): 1441 for key in value: 1442 value[key].DiscardUnknownFields() 1443 elif field.label == _FieldDescriptor.LABEL_REPEATED: 1444 for sub_message in value: 1445 sub_message.DiscardUnknownFields() 1446 else: 1447 value.DiscardUnknownFields()
Clears all fields in the UnknownFieldSet
.
This operation is recursive for nested message.
1098 def ByteSize(self): 1099 if not self._cached_byte_size_dirty: 1100 return self._cached_byte_size 1101 1102 size = 0 1103 descriptor = self.DESCRIPTOR 1104 if descriptor._is_map_entry: 1105 # Fields of map entry should always be serialized. 1106 key_field = descriptor.fields_by_name['key'] 1107 _MaybeAddEncoder(cls, key_field) 1108 size = key_field._sizer(self.key) 1109 value_field = descriptor.fields_by_name['value'] 1110 _MaybeAddEncoder(cls, value_field) 1111 size += value_field._sizer(self.value) 1112 else: 1113 for field_descriptor, field_value in self.ListFields(): 1114 _MaybeAddEncoder(cls, field_descriptor) 1115 size += field_descriptor._sizer(field_value) 1116 for tag_bytes, value_bytes in self._unknown_fields: 1117 size += len(tag_bytes) + len(value_bytes) 1118 1119 self._cached_byte_size = size 1120 self._cached_byte_size_dirty = False 1121 self._listener_for_children.dirty = False 1122 return size
Returns the serialized size of this message.
Recursively calls ByteSize() on all contained messages.
Returns:
int: The number of bytes required to serialize this message.
668 def getter(self): 669 field_value = self._fields.get(field) 670 if field_value is None: 671 # Construct a new object to represent this field. 672 field_value = field._default_constructor(self) 673 674 # Atomically check if another thread has preempted us and, if not, swap 675 # in the new object we just created. If someone has preempted us, we 676 # take that object and discard ours. 677 # WARNING: We are relying on setdefault() being atomic. This is true 678 # in CPython but we haven't investigated others. This warning appears 679 # in several other locations in this file. 680 field_value = self._fields.setdefault(field, field_value) 681 return field_value
Removes second-order cone constraints from the model.
Each value must be in [0, max(int64)). Values must be in strictly increasing order. Applies only to existing second-order cone constraint ids that have not yet been deleted.
668 def getter(self): 669 field_value = self._fields.get(field) 670 if field_value is None: 671 # Construct a new object to represent this field. 672 field_value = field._default_constructor(self) 673 674 # Atomically check if another thread has preempted us and, if not, swap 675 # in the new object we just created. If someone has preempted us, we 676 # take that object and discard ours. 677 # WARNING: We are relying on setdefault() being atomic. This is true 678 # in CPython but we haven't investigated others. This warning appears 679 # in several other locations in this file. 680 field_value = self._fields.setdefault(field, field_value) 681 return field_value
Add new second-order cone constraints to the model. All keys must be in [0, max(int64)), and must be greater than any ids used in the initial model and previous updates. All nonempty names should be distinct from existing names and each other.
1302 def FindInitializationErrors(self): 1303 """Finds required fields which are not initialized. 1304 1305 Returns: 1306 A list of strings. Each string is a path to an uninitialized field from 1307 the top-level message, e.g. "foo.bar[5].baz". 1308 """ 1309 1310 errors = [] # simplify things 1311 1312 for field in required_fields: 1313 if not self.HasField(field.name): 1314 errors.append(field.name) 1315 1316 for field, value in self.ListFields(): 1317 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 1318 if field.is_extension: 1319 name = '(%s)' % field.full_name 1320 else: 1321 name = field.name 1322 1323 if _IsMapField(field): 1324 if _IsMessageMapField(field): 1325 for key in value: 1326 element = value[key] 1327 prefix = '%s[%s].' % (name, key) 1328 sub_errors = element.FindInitializationErrors() 1329 errors += [prefix + error for error in sub_errors] 1330 else: 1331 # ScalarMaps can't have any initialization errors. 1332 pass 1333 elif field.label == _FieldDescriptor.LABEL_REPEATED: 1334 for i in range(len(value)): 1335 element = value[i] 1336 prefix = '%s[%d].' % (name, i) 1337 sub_errors = element.FindInitializationErrors() 1338 errors += [prefix + error for error in sub_errors] 1339 else: 1340 prefix = name + '.' 1341 sub_errors = value.FindInitializationErrors() 1342 errors += [prefix + error for error in sub_errors] 1343 1344 return errors
Finds required fields which are not initialized.
Returns:
A list of strings. Each string is a path to an uninitialized field from the top-level message, e.g. "foo.bar[5].baz".
Inherited Members
- google.protobuf.message.Message
- CopyFrom
- ParseFromString
- HasExtension
- ClearExtension
- UnknownFields
Abstract base class for protocol messages.
Protocol message classes are almost always generated by the protocol compiler. These generated types subclass Message and implement the methods shown below.
Inherited Members
- NewConstraintsEntry
- NewConstraintsEntry
- DESCRIPTOR
- MergeFrom
- Clear
- SetInParent
- IsInitialized
- MergeFromString
- SerializeToString
- SerializePartialToString
- ListFields
- HasField
- ClearField
- WhichOneof
- DiscardUnknownFields
- ByteSize
- FromString
- KEY_FIELD_NUMBER
- key
- VALUE_FIELD_NUMBER
- value
- FindInitializationErrors
- google.protobuf.message.Message
- CopyFrom
- ParseFromString
- HasExtension
- ClearExtension
- UnknownFields
Data for updates to SOS1 and SOS2 constraints; only addition and deletion, no support for in-place constraint updates.
498 def init(self, **kwargs): 499 self._cached_byte_size = 0 500 self._cached_byte_size_dirty = len(kwargs) > 0 501 self._fields = {} 502 # Contains a mapping from oneof field descriptors to the descriptor 503 # of the currently set field in that oneof field. 504 self._oneofs = {} 505 506 # _unknown_fields is () when empty for efficiency, and will be turned into 507 # a list if fields are added. 508 self._unknown_fields = () 509 self._is_present_in_parent = False 510 self._listener = message_listener_mod.NullMessageListener() 511 self._listener_for_children = _Listener(self) 512 for field_name, field_value in kwargs.items(): 513 field = _GetFieldByName(message_descriptor, field_name) 514 if field is None: 515 raise TypeError('%s() got an unexpected keyword argument "%s"' % 516 (message_descriptor.name, field_name)) 517 if field_value is None: 518 # field=None is the same as no field at all. 519 continue 520 if field.label == _FieldDescriptor.LABEL_REPEATED: 521 field_copy = field._default_constructor(self) 522 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: # Composite 523 if _IsMapField(field): 524 if _IsMessageMapField(field): 525 for key in field_value: 526 field_copy[key].MergeFrom(field_value[key]) 527 else: 528 field_copy.update(field_value) 529 else: 530 for val in field_value: 531 if isinstance(val, dict): 532 field_copy.add(**val) 533 else: 534 field_copy.add().MergeFrom(val) 535 else: # Scalar 536 if field.cpp_type == _FieldDescriptor.CPPTYPE_ENUM: 537 field_value = [_GetIntegerEnumValue(field.enum_type, val) 538 for val in field_value] 539 field_copy.extend(field_value) 540 self._fields[field] = field_copy 541 elif field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 542 field_copy = field._default_constructor(self) 543 new_val = None 544 if isinstance(field_value, message_mod.Message): 545 new_val = field_value 546 elif isinstance(field_value, dict): 547 if field.message_type.full_name == _StructFullTypeName: 548 field_copy.Clear() 549 if len(field_value) == 1 and 'fields' in field_value: 550 try: 551 field_copy.update(field_value) 552 except: 553 # Fall back to init normal message field 554 field_copy.Clear() 555 new_val = field.message_type._concrete_class(**field_value) 556 else: 557 field_copy.update(field_value) 558 else: 559 new_val = field.message_type._concrete_class(**field_value) 560 elif hasattr(field_copy, '_internal_assign'): 561 field_copy._internal_assign(field_value) 562 else: 563 raise TypeError( 564 'Message field {0}.{1} must be initialized with a ' 565 'dict or instance of same class, got {2}.'.format( 566 message_descriptor.name, 567 field_name, 568 type(field_value).__name__, 569 ) 570 ) 571 572 if new_val: 573 try: 574 field_copy.MergeFrom(new_val) 575 except TypeError: 576 _ReraiseTypeErrorWithFieldName(message_descriptor.name, field_name) 577 self._fields[field] = field_copy 578 else: 579 if field.cpp_type == _FieldDescriptor.CPPTYPE_ENUM: 580 field_value = _GetIntegerEnumValue(field.enum_type, field_value) 581 try: 582 setattr(self, field_name, field_value) 583 except TypeError: 584 _ReraiseTypeErrorWithFieldName(message_descriptor.name, field_name)
1361 def MergeFrom(self, msg): 1362 if not isinstance(msg, cls): 1363 raise TypeError( 1364 'Parameter to MergeFrom() must be instance of same class: ' 1365 'expected %s got %s.' % (_FullyQualifiedClassName(cls), 1366 _FullyQualifiedClassName(msg.__class__))) 1367 1368 assert msg is not self 1369 self._Modified() 1370 1371 fields = self._fields 1372 1373 for field, value in msg._fields.items(): 1374 if field.label == LABEL_REPEATED: 1375 field_value = fields.get(field) 1376 if field_value is None: 1377 # Construct a new object to represent this field. 1378 field_value = field._default_constructor(self) 1379 fields[field] = field_value 1380 field_value.MergeFrom(value) 1381 elif field.cpp_type == CPPTYPE_MESSAGE: 1382 if value._is_present_in_parent: 1383 field_value = fields.get(field) 1384 if field_value is None: 1385 # Construct a new object to represent this field. 1386 field_value = field._default_constructor(self) 1387 fields[field] = field_value 1388 field_value.MergeFrom(value) 1389 else: 1390 self._fields[field] = value 1391 if field.containing_oneof: 1392 self._UpdateOneofState(field) 1393 1394 if msg._unknown_fields: 1395 if not self._unknown_fields: 1396 self._unknown_fields = [] 1397 self._unknown_fields.extend(msg._unknown_fields)
Merges the contents of the specified message into current message.
This method merges the contents of the specified message into the current message. Singular fields that are set in the specified message overwrite the corresponding fields in the current message. Repeated fields are appended. Singular sub-messages and groups are recursively merged.
Arguments:
- other_msg (Message): A message to merge into the current message.
1420def _Clear(self): 1421 # Clear fields. 1422 self._fields = {} 1423 self._unknown_fields = () 1424 1425 self._oneofs = {} 1426 self._Modified()
Clears all data that was set in the message.
1486 def Modified(self): 1487 """Sets the _cached_byte_size_dirty bit to true, 1488 and propagates this to our listener iff this was a state change. 1489 """ 1490 1491 # Note: Some callers check _cached_byte_size_dirty before calling 1492 # _Modified() as an extra optimization. So, if this method is ever 1493 # changed such that it does stuff even when _cached_byte_size_dirty is 1494 # already true, the callers need to be updated. 1495 if not self._cached_byte_size_dirty: 1496 self._cached_byte_size_dirty = True 1497 self._listener_for_children.dirty = True 1498 self._is_present_in_parent = True 1499 self._listener.Modified()
Mark this as present in the parent.
This normally happens automatically when you assign a field of a sub-message, but sometimes you want to make the sub-message present while keeping it empty. If you find yourself using this, you may want to reconsider your design.
1262 def IsInitialized(self, errors=None): 1263 """Checks if all required fields of a message are set. 1264 1265 Args: 1266 errors: A list which, if provided, will be populated with the field 1267 paths of all missing required fields. 1268 1269 Returns: 1270 True iff the specified message has all required fields set. 1271 """ 1272 1273 # Performance is critical so we avoid HasField() and ListFields(). 1274 1275 for field in required_fields: 1276 if (field not in self._fields or 1277 (field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE and 1278 not self._fields[field]._is_present_in_parent)): 1279 if errors is not None: 1280 errors.extend(self.FindInitializationErrors()) 1281 return False 1282 1283 for field, value in list(self._fields.items()): # dict can change size! 1284 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 1285 if field.label == _FieldDescriptor.LABEL_REPEATED: 1286 if (field.message_type._is_map_entry): 1287 continue 1288 for element in value: 1289 if not element.IsInitialized(): 1290 if errors is not None: 1291 errors.extend(self.FindInitializationErrors()) 1292 return False 1293 elif value._is_present_in_parent and not value.IsInitialized(): 1294 if errors is not None: 1295 errors.extend(self.FindInitializationErrors()) 1296 return False 1297 1298 return True
Checks if the message is initialized.
Returns:
bool: The method returns True if the message is initialized (i.e. all of its required fields are set).
1177 def MergeFromString(self, serialized): 1178 serialized = memoryview(serialized) 1179 length = len(serialized) 1180 try: 1181 if self._InternalParse(serialized, 0, length) != length: 1182 # The only reason _InternalParse would return early is if it 1183 # encountered an end-group tag. 1184 raise message_mod.DecodeError('Unexpected end-group tag.') 1185 except (IndexError, TypeError): 1186 # Now ord(buf[p:p+1]) == ord('') gets TypeError. 1187 raise message_mod.DecodeError('Truncated message.') 1188 except struct.error as e: 1189 raise message_mod.DecodeError(e) 1190 return length # Return this for legacy reasons.
Merges serialized protocol buffer data into this message.
When we find a field in serialized
that is already present
in this message:
- If it's a "repeated" field, we append to the end of our list.
- Else, if it's a scalar, we overwrite our field.
- Else, (it's a nonrepeated composite), we recursively merge into the existing composite.
Arguments:
- serialized (bytes): Any object that allows us to call
memoryview(serialized)
to access a string of bytes using the buffer interface.
Returns:
int: The number of bytes read from
serialized
. For non-group messages, this will always belen(serialized)
, but for messages which are actually groups, this will generally be less thanlen(serialized)
, since we must stop when we reach anEND_GROUP
tag. Note that if we do stop because of anEND_GROUP
tag, the number of bytes returned does not include the bytes for theEND_GROUP
tag information.
Raises:
- DecodeError: if the input cannot be parsed.
1130 def SerializeToString(self, **kwargs): 1131 # Check if the message has all of its required fields set. 1132 if not self.IsInitialized(): 1133 raise message_mod.EncodeError( 1134 'Message %s is missing required fields: %s' % ( 1135 self.DESCRIPTOR.full_name, ','.join(self.FindInitializationErrors()))) 1136 return self.SerializePartialToString(**kwargs)
Serializes the protocol message to a binary string.
Keyword Args:
deterministic (bool): If true, requests deterministic serialization of the protobuf, with predictable ordering of map keys.
Returns:
A binary string representation of the message if all of the required fields in the message are set (i.e. the message is initialized).
Raises:
- EncodeError: if the message isn't initialized (see
IsInitialized()
).
1143 def SerializePartialToString(self, **kwargs): 1144 out = BytesIO() 1145 self._InternalSerialize(out.write, **kwargs) 1146 return out.getvalue()
Serializes the protocol message to a binary string.
This method is similar to SerializeToString but doesn't check if the message is initialized.
Keyword Args:
deterministic (bool): If true, requests deterministic serialization of the protobuf, with predictable ordering of map keys.
Returns:
bytes: A serialized representation of the partial message.
848 def ListFields(self): 849 all_fields = [item for item in self._fields.items() if _IsPresent(item)] 850 all_fields.sort(key = lambda item: item[0].number) 851 return all_fields
Returns a list of (FieldDescriptor, value) tuples for present fields.
A message field is non-empty if HasField() would return true. A singular primitive field is non-empty if HasField() would return true in proto2 or it is non zero in proto3. A repeated field is non-empty if it contains at least one element. The fields are ordered by field number.
Returns:
list[tuple(FieldDescriptor, value)]: field descriptors and values for all fields in the message which are not empty. The values vary by field type.
872 def HasField(self, field_name): 873 try: 874 field = hassable_fields[field_name] 875 except KeyError as exc: 876 raise ValueError('Protocol message %s has no non-repeated field "%s" ' 877 'nor has presence is not available for this field.' % ( 878 message_descriptor.full_name, field_name)) from exc 879 880 if isinstance(field, descriptor_mod.OneofDescriptor): 881 try: 882 return HasField(self, self._oneofs[field].name) 883 except KeyError: 884 return False 885 else: 886 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 887 value = self._fields.get(field) 888 return value is not None and value._is_present_in_parent 889 else: 890 return field in self._fields
Checks if a certain field is set for the message.
For a oneof group, checks if any field inside is set. Note that if the
field_name is not defined in the message descriptor, ValueError
will
be raised.
Arguments:
- field_name (str): The name of the field to check for presence.
Returns:
bool: Whether a value has been set for the named field.
Raises:
- ValueError: if the
field_name
is not a member of this message.
897 def ClearField(self, field_name): 898 try: 899 field = message_descriptor.fields_by_name[field_name] 900 except KeyError: 901 try: 902 field = message_descriptor.oneofs_by_name[field_name] 903 if field in self._oneofs: 904 field = self._oneofs[field] 905 else: 906 return 907 except KeyError: 908 raise ValueError('Protocol message %s has no "%s" field.' % 909 (message_descriptor.name, field_name)) 910 911 if field in self._fields: 912 # To match the C++ implementation, we need to invalidate iterators 913 # for map fields when ClearField() happens. 914 if hasattr(self._fields[field], 'InvalidateIterators'): 915 self._fields[field].InvalidateIterators() 916 917 # Note: If the field is a sub-message, its listener will still point 918 # at us. That's fine, because the worst than can happen is that it 919 # will call _Modified() and invalidate our byte size. Big deal. 920 del self._fields[field] 921 922 if self._oneofs.get(field.containing_oneof, None) is field: 923 del self._oneofs[field.containing_oneof] 924 925 # Always call _Modified() -- even if nothing was changed, this is 926 # a mutating method, and thus calling it should cause the field to become 927 # present in the parent message. 928 self._Modified()
Clears the contents of a given field.
Inside a oneof group, clears the field set. If the name neither refers to a
defined field or oneof group, ValueError
is raised.
Arguments:
- field_name (str): The name of the field to check for presence.
Raises:
- ValueError: if the
field_name
is not a member of this message.
1403 def WhichOneof(self, oneof_name): 1404 """Returns the name of the currently set field inside a oneof, or None.""" 1405 try: 1406 field = message_descriptor.oneofs_by_name[oneof_name] 1407 except KeyError: 1408 raise ValueError( 1409 'Protocol message has no oneof "%s" field.' % oneof_name) 1410 1411 nested_field = self._oneofs.get(field, None) 1412 if nested_field is not None and self.HasField(nested_field.name): 1413 return nested_field.name 1414 else: 1415 return None
Returns the name of the field that is set inside a oneof group.
If no field is set, returns None.
Arguments:
- oneof_group (str): the name of the oneof group to check.
Returns:
str or None: The name of the group that is set, or None.
Raises:
- ValueError: no group with the given name exists
1435def _DiscardUnknownFields(self): 1436 self._unknown_fields = [] 1437 for field, value in self.ListFields(): 1438 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 1439 if _IsMapField(field): 1440 if _IsMessageMapField(field): 1441 for key in value: 1442 value[key].DiscardUnknownFields() 1443 elif field.label == _FieldDescriptor.LABEL_REPEATED: 1444 for sub_message in value: 1445 sub_message.DiscardUnknownFields() 1446 else: 1447 value.DiscardUnknownFields()
Clears all fields in the UnknownFieldSet
.
This operation is recursive for nested message.
1098 def ByteSize(self): 1099 if not self._cached_byte_size_dirty: 1100 return self._cached_byte_size 1101 1102 size = 0 1103 descriptor = self.DESCRIPTOR 1104 if descriptor._is_map_entry: 1105 # Fields of map entry should always be serialized. 1106 key_field = descriptor.fields_by_name['key'] 1107 _MaybeAddEncoder(cls, key_field) 1108 size = key_field._sizer(self.key) 1109 value_field = descriptor.fields_by_name['value'] 1110 _MaybeAddEncoder(cls, value_field) 1111 size += value_field._sizer(self.value) 1112 else: 1113 for field_descriptor, field_value in self.ListFields(): 1114 _MaybeAddEncoder(cls, field_descriptor) 1115 size += field_descriptor._sizer(field_value) 1116 for tag_bytes, value_bytes in self._unknown_fields: 1117 size += len(tag_bytes) + len(value_bytes) 1118 1119 self._cached_byte_size = size 1120 self._cached_byte_size_dirty = False 1121 self._listener_for_children.dirty = False 1122 return size
Returns the serialized size of this message.
Recursively calls ByteSize() on all contained messages.
Returns:
int: The number of bytes required to serialize this message.
668 def getter(self): 669 field_value = self._fields.get(field) 670 if field_value is None: 671 # Construct a new object to represent this field. 672 field_value = field._default_constructor(self) 673 674 # Atomically check if another thread has preempted us and, if not, swap 675 # in the new object we just created. If someone has preempted us, we 676 # take that object and discard ours. 677 # WARNING: We are relying on setdefault() being atomic. This is true 678 # in CPython but we haven't investigated others. This warning appears 679 # in several other locations in this file. 680 field_value = self._fields.setdefault(field, field_value) 681 return field_value
Removes SOS constraints from the model.
Each value must be in [0, max(int64)). Values must be in strictly increasing order. Applies only to existing SOS constraint ids that have not yet been deleted.
668 def getter(self): 669 field_value = self._fields.get(field) 670 if field_value is None: 671 # Construct a new object to represent this field. 672 field_value = field._default_constructor(self) 673 674 # Atomically check if another thread has preempted us and, if not, swap 675 # in the new object we just created. If someone has preempted us, we 676 # take that object and discard ours. 677 # WARNING: We are relying on setdefault() being atomic. This is true 678 # in CPython but we haven't investigated others. This warning appears 679 # in several other locations in this file. 680 field_value = self._fields.setdefault(field, field_value) 681 return field_value
Add new SOS constraints to the model. All keys must be in [0, max(int64)), and must be greater than any ids used in the initial model and previous updates. All nonempty names should be distinct from existing names and each other.
1302 def FindInitializationErrors(self): 1303 """Finds required fields which are not initialized. 1304 1305 Returns: 1306 A list of strings. Each string is a path to an uninitialized field from 1307 the top-level message, e.g. "foo.bar[5].baz". 1308 """ 1309 1310 errors = [] # simplify things 1311 1312 for field in required_fields: 1313 if not self.HasField(field.name): 1314 errors.append(field.name) 1315 1316 for field, value in self.ListFields(): 1317 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 1318 if field.is_extension: 1319 name = '(%s)' % field.full_name 1320 else: 1321 name = field.name 1322 1323 if _IsMapField(field): 1324 if _IsMessageMapField(field): 1325 for key in value: 1326 element = value[key] 1327 prefix = '%s[%s].' % (name, key) 1328 sub_errors = element.FindInitializationErrors() 1329 errors += [prefix + error for error in sub_errors] 1330 else: 1331 # ScalarMaps can't have any initialization errors. 1332 pass 1333 elif field.label == _FieldDescriptor.LABEL_REPEATED: 1334 for i in range(len(value)): 1335 element = value[i] 1336 prefix = '%s[%d].' % (name, i) 1337 sub_errors = element.FindInitializationErrors() 1338 errors += [prefix + error for error in sub_errors] 1339 else: 1340 prefix = name + '.' 1341 sub_errors = value.FindInitializationErrors() 1342 errors += [prefix + error for error in sub_errors] 1343 1344 return errors
Finds required fields which are not initialized.
Returns:
A list of strings. Each string is a path to an uninitialized field from the top-level message, e.g. "foo.bar[5].baz".
Inherited Members
- google.protobuf.message.Message
- CopyFrom
- ParseFromString
- HasExtension
- ClearExtension
- UnknownFields
Abstract base class for protocol messages.
Protocol message classes are almost always generated by the protocol compiler. These generated types subclass Message and implement the methods shown below.
Inherited Members
- NewConstraintsEntry
- NewConstraintsEntry
- DESCRIPTOR
- MergeFrom
- Clear
- SetInParent
- IsInitialized
- MergeFromString
- SerializeToString
- SerializePartialToString
- ListFields
- HasField
- ClearField
- WhichOneof
- DiscardUnknownFields
- ByteSize
- FromString
- KEY_FIELD_NUMBER
- key
- VALUE_FIELD_NUMBER
- value
- FindInitializationErrors
- google.protobuf.message.Message
- CopyFrom
- ParseFromString
- HasExtension
- ClearExtension
- UnknownFields
Data for updates to indicator constraints; only addition and deletion, no support for in-place constraint updates.
498 def init(self, **kwargs): 499 self._cached_byte_size = 0 500 self._cached_byte_size_dirty = len(kwargs) > 0 501 self._fields = {} 502 # Contains a mapping from oneof field descriptors to the descriptor 503 # of the currently set field in that oneof field. 504 self._oneofs = {} 505 506 # _unknown_fields is () when empty for efficiency, and will be turned into 507 # a list if fields are added. 508 self._unknown_fields = () 509 self._is_present_in_parent = False 510 self._listener = message_listener_mod.NullMessageListener() 511 self._listener_for_children = _Listener(self) 512 for field_name, field_value in kwargs.items(): 513 field = _GetFieldByName(message_descriptor, field_name) 514 if field is None: 515 raise TypeError('%s() got an unexpected keyword argument "%s"' % 516 (message_descriptor.name, field_name)) 517 if field_value is None: 518 # field=None is the same as no field at all. 519 continue 520 if field.label == _FieldDescriptor.LABEL_REPEATED: 521 field_copy = field._default_constructor(self) 522 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: # Composite 523 if _IsMapField(field): 524 if _IsMessageMapField(field): 525 for key in field_value: 526 field_copy[key].MergeFrom(field_value[key]) 527 else: 528 field_copy.update(field_value) 529 else: 530 for val in field_value: 531 if isinstance(val, dict): 532 field_copy.add(**val) 533 else: 534 field_copy.add().MergeFrom(val) 535 else: # Scalar 536 if field.cpp_type == _FieldDescriptor.CPPTYPE_ENUM: 537 field_value = [_GetIntegerEnumValue(field.enum_type, val) 538 for val in field_value] 539 field_copy.extend(field_value) 540 self._fields[field] = field_copy 541 elif field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 542 field_copy = field._default_constructor(self) 543 new_val = None 544 if isinstance(field_value, message_mod.Message): 545 new_val = field_value 546 elif isinstance(field_value, dict): 547 if field.message_type.full_name == _StructFullTypeName: 548 field_copy.Clear() 549 if len(field_value) == 1 and 'fields' in field_value: 550 try: 551 field_copy.update(field_value) 552 except: 553 # Fall back to init normal message field 554 field_copy.Clear() 555 new_val = field.message_type._concrete_class(**field_value) 556 else: 557 field_copy.update(field_value) 558 else: 559 new_val = field.message_type._concrete_class(**field_value) 560 elif hasattr(field_copy, '_internal_assign'): 561 field_copy._internal_assign(field_value) 562 else: 563 raise TypeError( 564 'Message field {0}.{1} must be initialized with a ' 565 'dict or instance of same class, got {2}.'.format( 566 message_descriptor.name, 567 field_name, 568 type(field_value).__name__, 569 ) 570 ) 571 572 if new_val: 573 try: 574 field_copy.MergeFrom(new_val) 575 except TypeError: 576 _ReraiseTypeErrorWithFieldName(message_descriptor.name, field_name) 577 self._fields[field] = field_copy 578 else: 579 if field.cpp_type == _FieldDescriptor.CPPTYPE_ENUM: 580 field_value = _GetIntegerEnumValue(field.enum_type, field_value) 581 try: 582 setattr(self, field_name, field_value) 583 except TypeError: 584 _ReraiseTypeErrorWithFieldName(message_descriptor.name, field_name)
1361 def MergeFrom(self, msg): 1362 if not isinstance(msg, cls): 1363 raise TypeError( 1364 'Parameter to MergeFrom() must be instance of same class: ' 1365 'expected %s got %s.' % (_FullyQualifiedClassName(cls), 1366 _FullyQualifiedClassName(msg.__class__))) 1367 1368 assert msg is not self 1369 self._Modified() 1370 1371 fields = self._fields 1372 1373 for field, value in msg._fields.items(): 1374 if field.label == LABEL_REPEATED: 1375 field_value = fields.get(field) 1376 if field_value is None: 1377 # Construct a new object to represent this field. 1378 field_value = field._default_constructor(self) 1379 fields[field] = field_value 1380 field_value.MergeFrom(value) 1381 elif field.cpp_type == CPPTYPE_MESSAGE: 1382 if value._is_present_in_parent: 1383 field_value = fields.get(field) 1384 if field_value is None: 1385 # Construct a new object to represent this field. 1386 field_value = field._default_constructor(self) 1387 fields[field] = field_value 1388 field_value.MergeFrom(value) 1389 else: 1390 self._fields[field] = value 1391 if field.containing_oneof: 1392 self._UpdateOneofState(field) 1393 1394 if msg._unknown_fields: 1395 if not self._unknown_fields: 1396 self._unknown_fields = [] 1397 self._unknown_fields.extend(msg._unknown_fields)
Merges the contents of the specified message into current message.
This method merges the contents of the specified message into the current message. Singular fields that are set in the specified message overwrite the corresponding fields in the current message. Repeated fields are appended. Singular sub-messages and groups are recursively merged.
Arguments:
- other_msg (Message): A message to merge into the current message.
1420def _Clear(self): 1421 # Clear fields. 1422 self._fields = {} 1423 self._unknown_fields = () 1424 1425 self._oneofs = {} 1426 self._Modified()
Clears all data that was set in the message.
1486 def Modified(self): 1487 """Sets the _cached_byte_size_dirty bit to true, 1488 and propagates this to our listener iff this was a state change. 1489 """ 1490 1491 # Note: Some callers check _cached_byte_size_dirty before calling 1492 # _Modified() as an extra optimization. So, if this method is ever 1493 # changed such that it does stuff even when _cached_byte_size_dirty is 1494 # already true, the callers need to be updated. 1495 if not self._cached_byte_size_dirty: 1496 self._cached_byte_size_dirty = True 1497 self._listener_for_children.dirty = True 1498 self._is_present_in_parent = True 1499 self._listener.Modified()
Mark this as present in the parent.
This normally happens automatically when you assign a field of a sub-message, but sometimes you want to make the sub-message present while keeping it empty. If you find yourself using this, you may want to reconsider your design.
1262 def IsInitialized(self, errors=None): 1263 """Checks if all required fields of a message are set. 1264 1265 Args: 1266 errors: A list which, if provided, will be populated with the field 1267 paths of all missing required fields. 1268 1269 Returns: 1270 True iff the specified message has all required fields set. 1271 """ 1272 1273 # Performance is critical so we avoid HasField() and ListFields(). 1274 1275 for field in required_fields: 1276 if (field not in self._fields or 1277 (field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE and 1278 not self._fields[field]._is_present_in_parent)): 1279 if errors is not None: 1280 errors.extend(self.FindInitializationErrors()) 1281 return False 1282 1283 for field, value in list(self._fields.items()): # dict can change size! 1284 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 1285 if field.label == _FieldDescriptor.LABEL_REPEATED: 1286 if (field.message_type._is_map_entry): 1287 continue 1288 for element in value: 1289 if not element.IsInitialized(): 1290 if errors is not None: 1291 errors.extend(self.FindInitializationErrors()) 1292 return False 1293 elif value._is_present_in_parent and not value.IsInitialized(): 1294 if errors is not None: 1295 errors.extend(self.FindInitializationErrors()) 1296 return False 1297 1298 return True
Checks if the message is initialized.
Returns:
bool: The method returns True if the message is initialized (i.e. all of its required fields are set).
1177 def MergeFromString(self, serialized): 1178 serialized = memoryview(serialized) 1179 length = len(serialized) 1180 try: 1181 if self._InternalParse(serialized, 0, length) != length: 1182 # The only reason _InternalParse would return early is if it 1183 # encountered an end-group tag. 1184 raise message_mod.DecodeError('Unexpected end-group tag.') 1185 except (IndexError, TypeError): 1186 # Now ord(buf[p:p+1]) == ord('') gets TypeError. 1187 raise message_mod.DecodeError('Truncated message.') 1188 except struct.error as e: 1189 raise message_mod.DecodeError(e) 1190 return length # Return this for legacy reasons.
Merges serialized protocol buffer data into this message.
When we find a field in serialized
that is already present
in this message:
- If it's a "repeated" field, we append to the end of our list.
- Else, if it's a scalar, we overwrite our field.
- Else, (it's a nonrepeated composite), we recursively merge into the existing composite.
Arguments:
- serialized (bytes): Any object that allows us to call
memoryview(serialized)
to access a string of bytes using the buffer interface.
Returns:
int: The number of bytes read from
serialized
. For non-group messages, this will always belen(serialized)
, but for messages which are actually groups, this will generally be less thanlen(serialized)
, since we must stop when we reach anEND_GROUP
tag. Note that if we do stop because of anEND_GROUP
tag, the number of bytes returned does not include the bytes for theEND_GROUP
tag information.
Raises:
- DecodeError: if the input cannot be parsed.
1130 def SerializeToString(self, **kwargs): 1131 # Check if the message has all of its required fields set. 1132 if not self.IsInitialized(): 1133 raise message_mod.EncodeError( 1134 'Message %s is missing required fields: %s' % ( 1135 self.DESCRIPTOR.full_name, ','.join(self.FindInitializationErrors()))) 1136 return self.SerializePartialToString(**kwargs)
Serializes the protocol message to a binary string.
Keyword Args:
deterministic (bool): If true, requests deterministic serialization of the protobuf, with predictable ordering of map keys.
Returns:
A binary string representation of the message if all of the required fields in the message are set (i.e. the message is initialized).
Raises:
- EncodeError: if the message isn't initialized (see
IsInitialized()
).
1143 def SerializePartialToString(self, **kwargs): 1144 out = BytesIO() 1145 self._InternalSerialize(out.write, **kwargs) 1146 return out.getvalue()
Serializes the protocol message to a binary string.
This method is similar to SerializeToString but doesn't check if the message is initialized.
Keyword Args:
deterministic (bool): If true, requests deterministic serialization of the protobuf, with predictable ordering of map keys.
Returns:
bytes: A serialized representation of the partial message.
848 def ListFields(self): 849 all_fields = [item for item in self._fields.items() if _IsPresent(item)] 850 all_fields.sort(key = lambda item: item[0].number) 851 return all_fields
Returns a list of (FieldDescriptor, value) tuples for present fields.
A message field is non-empty if HasField() would return true. A singular primitive field is non-empty if HasField() would return true in proto2 or it is non zero in proto3. A repeated field is non-empty if it contains at least one element. The fields are ordered by field number.
Returns:
list[tuple(FieldDescriptor, value)]: field descriptors and values for all fields in the message which are not empty. The values vary by field type.
872 def HasField(self, field_name): 873 try: 874 field = hassable_fields[field_name] 875 except KeyError as exc: 876 raise ValueError('Protocol message %s has no non-repeated field "%s" ' 877 'nor has presence is not available for this field.' % ( 878 message_descriptor.full_name, field_name)) from exc 879 880 if isinstance(field, descriptor_mod.OneofDescriptor): 881 try: 882 return HasField(self, self._oneofs[field].name) 883 except KeyError: 884 return False 885 else: 886 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 887 value = self._fields.get(field) 888 return value is not None and value._is_present_in_parent 889 else: 890 return field in self._fields
Checks if a certain field is set for the message.
For a oneof group, checks if any field inside is set. Note that if the
field_name is not defined in the message descriptor, ValueError
will
be raised.
Arguments:
- field_name (str): The name of the field to check for presence.
Returns:
bool: Whether a value has been set for the named field.
Raises:
- ValueError: if the
field_name
is not a member of this message.
897 def ClearField(self, field_name): 898 try: 899 field = message_descriptor.fields_by_name[field_name] 900 except KeyError: 901 try: 902 field = message_descriptor.oneofs_by_name[field_name] 903 if field in self._oneofs: 904 field = self._oneofs[field] 905 else: 906 return 907 except KeyError: 908 raise ValueError('Protocol message %s has no "%s" field.' % 909 (message_descriptor.name, field_name)) 910 911 if field in self._fields: 912 # To match the C++ implementation, we need to invalidate iterators 913 # for map fields when ClearField() happens. 914 if hasattr(self._fields[field], 'InvalidateIterators'): 915 self._fields[field].InvalidateIterators() 916 917 # Note: If the field is a sub-message, its listener will still point 918 # at us. That's fine, because the worst than can happen is that it 919 # will call _Modified() and invalidate our byte size. Big deal. 920 del self._fields[field] 921 922 if self._oneofs.get(field.containing_oneof, None) is field: 923 del self._oneofs[field.containing_oneof] 924 925 # Always call _Modified() -- even if nothing was changed, this is 926 # a mutating method, and thus calling it should cause the field to become 927 # present in the parent message. 928 self._Modified()
Clears the contents of a given field.
Inside a oneof group, clears the field set. If the name neither refers to a
defined field or oneof group, ValueError
is raised.
Arguments:
- field_name (str): The name of the field to check for presence.
Raises:
- ValueError: if the
field_name
is not a member of this message.
1403 def WhichOneof(self, oneof_name): 1404 """Returns the name of the currently set field inside a oneof, or None.""" 1405 try: 1406 field = message_descriptor.oneofs_by_name[oneof_name] 1407 except KeyError: 1408 raise ValueError( 1409 'Protocol message has no oneof "%s" field.' % oneof_name) 1410 1411 nested_field = self._oneofs.get(field, None) 1412 if nested_field is not None and self.HasField(nested_field.name): 1413 return nested_field.name 1414 else: 1415 return None
Returns the name of the field that is set inside a oneof group.
If no field is set, returns None.
Arguments:
- oneof_group (str): the name of the oneof group to check.
Returns:
str or None: The name of the group that is set, or None.
Raises:
- ValueError: no group with the given name exists
1435def _DiscardUnknownFields(self): 1436 self._unknown_fields = [] 1437 for field, value in self.ListFields(): 1438 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 1439 if _IsMapField(field): 1440 if _IsMessageMapField(field): 1441 for key in value: 1442 value[key].DiscardUnknownFields() 1443 elif field.label == _FieldDescriptor.LABEL_REPEATED: 1444 for sub_message in value: 1445 sub_message.DiscardUnknownFields() 1446 else: 1447 value.DiscardUnknownFields()
Clears all fields in the UnknownFieldSet
.
This operation is recursive for nested message.
1098 def ByteSize(self): 1099 if not self._cached_byte_size_dirty: 1100 return self._cached_byte_size 1101 1102 size = 0 1103 descriptor = self.DESCRIPTOR 1104 if descriptor._is_map_entry: 1105 # Fields of map entry should always be serialized. 1106 key_field = descriptor.fields_by_name['key'] 1107 _MaybeAddEncoder(cls, key_field) 1108 size = key_field._sizer(self.key) 1109 value_field = descriptor.fields_by_name['value'] 1110 _MaybeAddEncoder(cls, value_field) 1111 size += value_field._sizer(self.value) 1112 else: 1113 for field_descriptor, field_value in self.ListFields(): 1114 _MaybeAddEncoder(cls, field_descriptor) 1115 size += field_descriptor._sizer(field_value) 1116 for tag_bytes, value_bytes in self._unknown_fields: 1117 size += len(tag_bytes) + len(value_bytes) 1118 1119 self._cached_byte_size = size 1120 self._cached_byte_size_dirty = False 1121 self._listener_for_children.dirty = False 1122 return size
Returns the serialized size of this message.
Recursively calls ByteSize() on all contained messages.
Returns:
int: The number of bytes required to serialize this message.
668 def getter(self): 669 field_value = self._fields.get(field) 670 if field_value is None: 671 # Construct a new object to represent this field. 672 field_value = field._default_constructor(self) 673 674 # Atomically check if another thread has preempted us and, if not, swap 675 # in the new object we just created. If someone has preempted us, we 676 # take that object and discard ours. 677 # WARNING: We are relying on setdefault() being atomic. This is true 678 # in CPython but we haven't investigated others. This warning appears 679 # in several other locations in this file. 680 field_value = self._fields.setdefault(field, field_value) 681 return field_value
Removes indicator constraints from the model.
Each value must be in [0, max(int64)). Values must be in strictly increasing order. Applies only to existing indicator constraint ids that have not yet been deleted.
668 def getter(self): 669 field_value = self._fields.get(field) 670 if field_value is None: 671 # Construct a new object to represent this field. 672 field_value = field._default_constructor(self) 673 674 # Atomically check if another thread has preempted us and, if not, swap 675 # in the new object we just created. If someone has preempted us, we 676 # take that object and discard ours. 677 # WARNING: We are relying on setdefault() being atomic. This is true 678 # in CPython but we haven't investigated others. This warning appears 679 # in several other locations in this file. 680 field_value = self._fields.setdefault(field, field_value) 681 return field_value
Add new indicator constraints to the model. All keys must be in [0, max(int64)), and must be greater than any ids used in the initial model and previous updates. All nonempty names should be distinct from existing names and each other.
1302 def FindInitializationErrors(self): 1303 """Finds required fields which are not initialized. 1304 1305 Returns: 1306 A list of strings. Each string is a path to an uninitialized field from 1307 the top-level message, e.g. "foo.bar[5].baz". 1308 """ 1309 1310 errors = [] # simplify things 1311 1312 for field in required_fields: 1313 if not self.HasField(field.name): 1314 errors.append(field.name) 1315 1316 for field, value in self.ListFields(): 1317 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 1318 if field.is_extension: 1319 name = '(%s)' % field.full_name 1320 else: 1321 name = field.name 1322 1323 if _IsMapField(field): 1324 if _IsMessageMapField(field): 1325 for key in value: 1326 element = value[key] 1327 prefix = '%s[%s].' % (name, key) 1328 sub_errors = element.FindInitializationErrors() 1329 errors += [prefix + error for error in sub_errors] 1330 else: 1331 # ScalarMaps can't have any initialization errors. 1332 pass 1333 elif field.label == _FieldDescriptor.LABEL_REPEATED: 1334 for i in range(len(value)): 1335 element = value[i] 1336 prefix = '%s[%d].' % (name, i) 1337 sub_errors = element.FindInitializationErrors() 1338 errors += [prefix + error for error in sub_errors] 1339 else: 1340 prefix = name + '.' 1341 sub_errors = value.FindInitializationErrors() 1342 errors += [prefix + error for error in sub_errors] 1343 1344 return errors
Finds required fields which are not initialized.
Returns:
A list of strings. Each string is a path to an uninitialized field from the top-level message, e.g. "foo.bar[5].baz".
Inherited Members
- google.protobuf.message.Message
- CopyFrom
- ParseFromString
- HasExtension
- ClearExtension
- UnknownFields
Abstract base class for protocol messages.
Protocol message classes are almost always generated by the protocol compiler. These generated types subclass Message and implement the methods shown below.
Inherited Members
- NewConstraintsEntry
- NewConstraintsEntry
- DESCRIPTOR
- MergeFrom
- Clear
- SetInParent
- IsInitialized
- MergeFromString
- SerializeToString
- SerializePartialToString
- ListFields
- HasField
- ClearField
- WhichOneof
- DiscardUnknownFields
- ByteSize
- FromString
- KEY_FIELD_NUMBER
- key
- VALUE_FIELD_NUMBER
- value
- FindInitializationErrors
- google.protobuf.message.Message
- CopyFrom
- ParseFromString
- HasExtension
- ClearExtension
- UnknownFields
Updates to a ModelProto.
498 def init(self, **kwargs): 499 self._cached_byte_size = 0 500 self._cached_byte_size_dirty = len(kwargs) > 0 501 self._fields = {} 502 # Contains a mapping from oneof field descriptors to the descriptor 503 # of the currently set field in that oneof field. 504 self._oneofs = {} 505 506 # _unknown_fields is () when empty for efficiency, and will be turned into 507 # a list if fields are added. 508 self._unknown_fields = () 509 self._is_present_in_parent = False 510 self._listener = message_listener_mod.NullMessageListener() 511 self._listener_for_children = _Listener(self) 512 for field_name, field_value in kwargs.items(): 513 field = _GetFieldByName(message_descriptor, field_name) 514 if field is None: 515 raise TypeError('%s() got an unexpected keyword argument "%s"' % 516 (message_descriptor.name, field_name)) 517 if field_value is None: 518 # field=None is the same as no field at all. 519 continue 520 if field.label == _FieldDescriptor.LABEL_REPEATED: 521 field_copy = field._default_constructor(self) 522 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: # Composite 523 if _IsMapField(field): 524 if _IsMessageMapField(field): 525 for key in field_value: 526 field_copy[key].MergeFrom(field_value[key]) 527 else: 528 field_copy.update(field_value) 529 else: 530 for val in field_value: 531 if isinstance(val, dict): 532 field_copy.add(**val) 533 else: 534 field_copy.add().MergeFrom(val) 535 else: # Scalar 536 if field.cpp_type == _FieldDescriptor.CPPTYPE_ENUM: 537 field_value = [_GetIntegerEnumValue(field.enum_type, val) 538 for val in field_value] 539 field_copy.extend(field_value) 540 self._fields[field] = field_copy 541 elif field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 542 field_copy = field._default_constructor(self) 543 new_val = None 544 if isinstance(field_value, message_mod.Message): 545 new_val = field_value 546 elif isinstance(field_value, dict): 547 if field.message_type.full_name == _StructFullTypeName: 548 field_copy.Clear() 549 if len(field_value) == 1 and 'fields' in field_value: 550 try: 551 field_copy.update(field_value) 552 except: 553 # Fall back to init normal message field 554 field_copy.Clear() 555 new_val = field.message_type._concrete_class(**field_value) 556 else: 557 field_copy.update(field_value) 558 else: 559 new_val = field.message_type._concrete_class(**field_value) 560 elif hasattr(field_copy, '_internal_assign'): 561 field_copy._internal_assign(field_value) 562 else: 563 raise TypeError( 564 'Message field {0}.{1} must be initialized with a ' 565 'dict or instance of same class, got {2}.'.format( 566 message_descriptor.name, 567 field_name, 568 type(field_value).__name__, 569 ) 570 ) 571 572 if new_val: 573 try: 574 field_copy.MergeFrom(new_val) 575 except TypeError: 576 _ReraiseTypeErrorWithFieldName(message_descriptor.name, field_name) 577 self._fields[field] = field_copy 578 else: 579 if field.cpp_type == _FieldDescriptor.CPPTYPE_ENUM: 580 field_value = _GetIntegerEnumValue(field.enum_type, field_value) 581 try: 582 setattr(self, field_name, field_value) 583 except TypeError: 584 _ReraiseTypeErrorWithFieldName(message_descriptor.name, field_name)
1361 def MergeFrom(self, msg): 1362 if not isinstance(msg, cls): 1363 raise TypeError( 1364 'Parameter to MergeFrom() must be instance of same class: ' 1365 'expected %s got %s.' % (_FullyQualifiedClassName(cls), 1366 _FullyQualifiedClassName(msg.__class__))) 1367 1368 assert msg is not self 1369 self._Modified() 1370 1371 fields = self._fields 1372 1373 for field, value in msg._fields.items(): 1374 if field.label == LABEL_REPEATED: 1375 field_value = fields.get(field) 1376 if field_value is None: 1377 # Construct a new object to represent this field. 1378 field_value = field._default_constructor(self) 1379 fields[field] = field_value 1380 field_value.MergeFrom(value) 1381 elif field.cpp_type == CPPTYPE_MESSAGE: 1382 if value._is_present_in_parent: 1383 field_value = fields.get(field) 1384 if field_value is None: 1385 # Construct a new object to represent this field. 1386 field_value = field._default_constructor(self) 1387 fields[field] = field_value 1388 field_value.MergeFrom(value) 1389 else: 1390 self._fields[field] = value 1391 if field.containing_oneof: 1392 self._UpdateOneofState(field) 1393 1394 if msg._unknown_fields: 1395 if not self._unknown_fields: 1396 self._unknown_fields = [] 1397 self._unknown_fields.extend(msg._unknown_fields)
Merges the contents of the specified message into current message.
This method merges the contents of the specified message into the current message. Singular fields that are set in the specified message overwrite the corresponding fields in the current message. Repeated fields are appended. Singular sub-messages and groups are recursively merged.
Arguments:
- other_msg (Message): A message to merge into the current message.
1420def _Clear(self): 1421 # Clear fields. 1422 self._fields = {} 1423 self._unknown_fields = () 1424 1425 self._oneofs = {} 1426 self._Modified()
Clears all data that was set in the message.
1486 def Modified(self): 1487 """Sets the _cached_byte_size_dirty bit to true, 1488 and propagates this to our listener iff this was a state change. 1489 """ 1490 1491 # Note: Some callers check _cached_byte_size_dirty before calling 1492 # _Modified() as an extra optimization. So, if this method is ever 1493 # changed such that it does stuff even when _cached_byte_size_dirty is 1494 # already true, the callers need to be updated. 1495 if not self._cached_byte_size_dirty: 1496 self._cached_byte_size_dirty = True 1497 self._listener_for_children.dirty = True 1498 self._is_present_in_parent = True 1499 self._listener.Modified()
Mark this as present in the parent.
This normally happens automatically when you assign a field of a sub-message, but sometimes you want to make the sub-message present while keeping it empty. If you find yourself using this, you may want to reconsider your design.
1262 def IsInitialized(self, errors=None): 1263 """Checks if all required fields of a message are set. 1264 1265 Args: 1266 errors: A list which, if provided, will be populated with the field 1267 paths of all missing required fields. 1268 1269 Returns: 1270 True iff the specified message has all required fields set. 1271 """ 1272 1273 # Performance is critical so we avoid HasField() and ListFields(). 1274 1275 for field in required_fields: 1276 if (field not in self._fields or 1277 (field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE and 1278 not self._fields[field]._is_present_in_parent)): 1279 if errors is not None: 1280 errors.extend(self.FindInitializationErrors()) 1281 return False 1282 1283 for field, value in list(self._fields.items()): # dict can change size! 1284 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 1285 if field.label == _FieldDescriptor.LABEL_REPEATED: 1286 if (field.message_type._is_map_entry): 1287 continue 1288 for element in value: 1289 if not element.IsInitialized(): 1290 if errors is not None: 1291 errors.extend(self.FindInitializationErrors()) 1292 return False 1293 elif value._is_present_in_parent and not value.IsInitialized(): 1294 if errors is not None: 1295 errors.extend(self.FindInitializationErrors()) 1296 return False 1297 1298 return True
Checks if the message is initialized.
Returns:
bool: The method returns True if the message is initialized (i.e. all of its required fields are set).
1177 def MergeFromString(self, serialized): 1178 serialized = memoryview(serialized) 1179 length = len(serialized) 1180 try: 1181 if self._InternalParse(serialized, 0, length) != length: 1182 # The only reason _InternalParse would return early is if it 1183 # encountered an end-group tag. 1184 raise message_mod.DecodeError('Unexpected end-group tag.') 1185 except (IndexError, TypeError): 1186 # Now ord(buf[p:p+1]) == ord('') gets TypeError. 1187 raise message_mod.DecodeError('Truncated message.') 1188 except struct.error as e: 1189 raise message_mod.DecodeError(e) 1190 return length # Return this for legacy reasons.
Merges serialized protocol buffer data into this message.
When we find a field in serialized
that is already present
in this message:
- If it's a "repeated" field, we append to the end of our list.
- Else, if it's a scalar, we overwrite our field.
- Else, (it's a nonrepeated composite), we recursively merge into the existing composite.
Arguments:
- serialized (bytes): Any object that allows us to call
memoryview(serialized)
to access a string of bytes using the buffer interface.
Returns:
int: The number of bytes read from
serialized
. For non-group messages, this will always belen(serialized)
, but for messages which are actually groups, this will generally be less thanlen(serialized)
, since we must stop when we reach anEND_GROUP
tag. Note that if we do stop because of anEND_GROUP
tag, the number of bytes returned does not include the bytes for theEND_GROUP
tag information.
Raises:
- DecodeError: if the input cannot be parsed.
1130 def SerializeToString(self, **kwargs): 1131 # Check if the message has all of its required fields set. 1132 if not self.IsInitialized(): 1133 raise message_mod.EncodeError( 1134 'Message %s is missing required fields: %s' % ( 1135 self.DESCRIPTOR.full_name, ','.join(self.FindInitializationErrors()))) 1136 return self.SerializePartialToString(**kwargs)
Serializes the protocol message to a binary string.
Keyword Args:
deterministic (bool): If true, requests deterministic serialization of the protobuf, with predictable ordering of map keys.
Returns:
A binary string representation of the message if all of the required fields in the message are set (i.e. the message is initialized).
Raises:
- EncodeError: if the message isn't initialized (see
IsInitialized()
).
1143 def SerializePartialToString(self, **kwargs): 1144 out = BytesIO() 1145 self._InternalSerialize(out.write, **kwargs) 1146 return out.getvalue()
Serializes the protocol message to a binary string.
This method is similar to SerializeToString but doesn't check if the message is initialized.
Keyword Args:
deterministic (bool): If true, requests deterministic serialization of the protobuf, with predictable ordering of map keys.
Returns:
bytes: A serialized representation of the partial message.
848 def ListFields(self): 849 all_fields = [item for item in self._fields.items() if _IsPresent(item)] 850 all_fields.sort(key = lambda item: item[0].number) 851 return all_fields
Returns a list of (FieldDescriptor, value) tuples for present fields.
A message field is non-empty if HasField() would return true. A singular primitive field is non-empty if HasField() would return true in proto2 or it is non zero in proto3. A repeated field is non-empty if it contains at least one element. The fields are ordered by field number.
Returns:
list[tuple(FieldDescriptor, value)]: field descriptors and values for all fields in the message which are not empty. The values vary by field type.
872 def HasField(self, field_name): 873 try: 874 field = hassable_fields[field_name] 875 except KeyError as exc: 876 raise ValueError('Protocol message %s has no non-repeated field "%s" ' 877 'nor has presence is not available for this field.' % ( 878 message_descriptor.full_name, field_name)) from exc 879 880 if isinstance(field, descriptor_mod.OneofDescriptor): 881 try: 882 return HasField(self, self._oneofs[field].name) 883 except KeyError: 884 return False 885 else: 886 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 887 value = self._fields.get(field) 888 return value is not None and value._is_present_in_parent 889 else: 890 return field in self._fields
Checks if a certain field is set for the message.
For a oneof group, checks if any field inside is set. Note that if the
field_name is not defined in the message descriptor, ValueError
will
be raised.
Arguments:
- field_name (str): The name of the field to check for presence.
Returns:
bool: Whether a value has been set for the named field.
Raises:
- ValueError: if the
field_name
is not a member of this message.
897 def ClearField(self, field_name): 898 try: 899 field = message_descriptor.fields_by_name[field_name] 900 except KeyError: 901 try: 902 field = message_descriptor.oneofs_by_name[field_name] 903 if field in self._oneofs: 904 field = self._oneofs[field] 905 else: 906 return 907 except KeyError: 908 raise ValueError('Protocol message %s has no "%s" field.' % 909 (message_descriptor.name, field_name)) 910 911 if field in self._fields: 912 # To match the C++ implementation, we need to invalidate iterators 913 # for map fields when ClearField() happens. 914 if hasattr(self._fields[field], 'InvalidateIterators'): 915 self._fields[field].InvalidateIterators() 916 917 # Note: If the field is a sub-message, its listener will still point 918 # at us. That's fine, because the worst than can happen is that it 919 # will call _Modified() and invalidate our byte size. Big deal. 920 del self._fields[field] 921 922 if self._oneofs.get(field.containing_oneof, None) is field: 923 del self._oneofs[field.containing_oneof] 924 925 # Always call _Modified() -- even if nothing was changed, this is 926 # a mutating method, and thus calling it should cause the field to become 927 # present in the parent message. 928 self._Modified()
Clears the contents of a given field.
Inside a oneof group, clears the field set. If the name neither refers to a
defined field or oneof group, ValueError
is raised.
Arguments:
- field_name (str): The name of the field to check for presence.
Raises:
- ValueError: if the
field_name
is not a member of this message.
1403 def WhichOneof(self, oneof_name): 1404 """Returns the name of the currently set field inside a oneof, or None.""" 1405 try: 1406 field = message_descriptor.oneofs_by_name[oneof_name] 1407 except KeyError: 1408 raise ValueError( 1409 'Protocol message has no oneof "%s" field.' % oneof_name) 1410 1411 nested_field = self._oneofs.get(field, None) 1412 if nested_field is not None and self.HasField(nested_field.name): 1413 return nested_field.name 1414 else: 1415 return None
Returns the name of the field that is set inside a oneof group.
If no field is set, returns None.
Arguments:
- oneof_group (str): the name of the oneof group to check.
Returns:
str or None: The name of the group that is set, or None.
Raises:
- ValueError: no group with the given name exists
1435def _DiscardUnknownFields(self): 1436 self._unknown_fields = [] 1437 for field, value in self.ListFields(): 1438 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 1439 if _IsMapField(field): 1440 if _IsMessageMapField(field): 1441 for key in value: 1442 value[key].DiscardUnknownFields() 1443 elif field.label == _FieldDescriptor.LABEL_REPEATED: 1444 for sub_message in value: 1445 sub_message.DiscardUnknownFields() 1446 else: 1447 value.DiscardUnknownFields()
Clears all fields in the UnknownFieldSet
.
This operation is recursive for nested message.
1098 def ByteSize(self): 1099 if not self._cached_byte_size_dirty: 1100 return self._cached_byte_size 1101 1102 size = 0 1103 descriptor = self.DESCRIPTOR 1104 if descriptor._is_map_entry: 1105 # Fields of map entry should always be serialized. 1106 key_field = descriptor.fields_by_name['key'] 1107 _MaybeAddEncoder(cls, key_field) 1108 size = key_field._sizer(self.key) 1109 value_field = descriptor.fields_by_name['value'] 1110 _MaybeAddEncoder(cls, value_field) 1111 size += value_field._sizer(self.value) 1112 else: 1113 for field_descriptor, field_value in self.ListFields(): 1114 _MaybeAddEncoder(cls, field_descriptor) 1115 size += field_descriptor._sizer(field_value) 1116 for tag_bytes, value_bytes in self._unknown_fields: 1117 size += len(tag_bytes) + len(value_bytes) 1118 1119 self._cached_byte_size = size 1120 self._cached_byte_size_dirty = False 1121 self._listener_for_children.dirty = False 1122 return size
Returns the serialized size of this message.
Recursively calls ByteSize() on all contained messages.
Returns:
int: The number of bytes required to serialize this message.
668 def getter(self): 669 field_value = self._fields.get(field) 670 if field_value is None: 671 # Construct a new object to represent this field. 672 field_value = field._default_constructor(self) 673 674 # Atomically check if another thread has preempted us and, if not, swap 675 # in the new object we just created. If someone has preempted us, we 676 # take that object and discard ours. 677 # WARNING: We are relying on setdefault() being atomic. This is true 678 # in CPython but we haven't investigated others. This warning appears 679 # in several other locations in this file. 680 field_value = self._fields.setdefault(field, field_value) 681 return field_value
Removes variables from the model.
Values must be in strictly increasing order. Apply only to existing variable ids that have not yet been deleted. The ids of deleted variables should not appear in other fields (e.g. variable_updates, objective_updates, linear_constraint_matrix_updates).
668 def getter(self): 669 field_value = self._fields.get(field) 670 if field_value is None: 671 # Construct a new object to represent this field. 672 field_value = field._default_constructor(self) 673 674 # Atomically check if another thread has preempted us and, if not, swap 675 # in the new object we just created. If someone has preempted us, we 676 # take that object and discard ours. 677 # WARNING: We are relying on setdefault() being atomic. This is true 678 # in CPython but we haven't investigated others. This warning appears 679 # in several other locations in this file. 680 field_value = self._fields.setdefault(field, field_value) 681 return field_value
Removes linear constraints from the model.
Values must be in strictly increasing order. Apply only to existing linear constraint ids that have not yet been deleted. The ids of deleted linear constraints should not appear in other fields (e.g. linear_constraint_updates, linear_constraint_matrix_updates).
767 def getter(self): 768 field_value = self._fields.get(field) 769 if field_value is None: 770 # Construct a new object to represent this field. 771 field_value = field._default_constructor(self) 772 773 # Atomically check if another thread has preempted us and, if not, swap 774 # in the new object we just created. If someone has preempted us, we 775 # take that object and discard ours. 776 # WARNING: We are relying on setdefault() being atomic. This is true 777 # in CPython but we haven't investigated others. This warning appears 778 # in several other locations in this file. 779 field_value = self._fields.setdefault(field, field_value) 780 return field_value
Updates properties of existing variables. Should not contain any deleted variable ids.
767 def getter(self): 768 field_value = self._fields.get(field) 769 if field_value is None: 770 # Construct a new object to represent this field. 771 field_value = field._default_constructor(self) 772 773 # Atomically check if another thread has preempted us and, if not, swap 774 # in the new object we just created. If someone has preempted us, we 775 # take that object and discard ours. 776 # WARNING: We are relying on setdefault() being atomic. This is true 777 # in CPython but we haven't investigated others. This warning appears 778 # in several other locations in this file. 779 field_value = self._fields.setdefault(field, field_value) 780 return field_value
Updates properties of existing linear constraints. Should not contain any deleted linear constraints ids.
767 def getter(self): 768 field_value = self._fields.get(field) 769 if field_value is None: 770 # Construct a new object to represent this field. 771 field_value = field._default_constructor(self) 772 773 # Atomically check if another thread has preempted us and, if not, swap 774 # in the new object we just created. If someone has preempted us, we 775 # take that object and discard ours. 776 # WARNING: We are relying on setdefault() being atomic. This is true 777 # in CPython but we haven't investigated others. This warning appears 778 # in several other locations in this file. 779 field_value = self._fields.setdefault(field, field_value) 780 return field_value
Add new variables to the model. All new_variables.ids must be greater than any ids used in the initial model and previous updates. All nonempty names should be distinct from existing names.
767 def getter(self): 768 field_value = self._fields.get(field) 769 if field_value is None: 770 # Construct a new object to represent this field. 771 field_value = field._default_constructor(self) 772 773 # Atomically check if another thread has preempted us and, if not, swap 774 # in the new object we just created. If someone has preempted us, we 775 # take that object and discard ours. 776 # WARNING: We are relying on setdefault() being atomic. This is true 777 # in CPython but we haven't investigated others. This warning appears 778 # in several other locations in this file. 779 field_value = self._fields.setdefault(field, field_value) 780 return field_value
Add new linear constraints to the model. All new_linear_constraints.ids must be greater than any ids used in the initial model and previous updates. All nonempty names should be distinct from existing names.
767 def getter(self): 768 field_value = self._fields.get(field) 769 if field_value is None: 770 # Construct a new object to represent this field. 771 field_value = field._default_constructor(self) 772 773 # Atomically check if another thread has preempted us and, if not, swap 774 # in the new object we just created. If someone has preempted us, we 775 # take that object and discard ours. 776 # WARNING: We are relying on setdefault() being atomic. This is true 777 # in CPython but we haven't investigated others. This warning appears 778 # in several other locations in this file. 779 field_value = self._fields.setdefault(field, field_value) 780 return field_value
Updates the primary objective, both for existing and new variables.
767 def getter(self): 768 field_value = self._fields.get(field) 769 if field_value is None: 770 # Construct a new object to represent this field. 771 field_value = field._default_constructor(self) 772 773 # Atomically check if another thread has preempted us and, if not, swap 774 # in the new object we just created. If someone has preempted us, we 775 # take that object and discard ours. 776 # WARNING: We are relying on setdefault() being atomic. This is true 777 # in CPython but we haven't investigated others. This warning appears 778 # in several other locations in this file. 779 field_value = self._fields.setdefault(field, field_value) 780 return field_value
Updates the auxiliary objectives, both for existing and new variables.
767 def getter(self): 768 field_value = self._fields.get(field) 769 if field_value is None: 770 # Construct a new object to represent this field. 771 field_value = field._default_constructor(self) 772 773 # Atomically check if another thread has preempted us and, if not, swap 774 # in the new object we just created. If someone has preempted us, we 775 # take that object and discard ours. 776 # WARNING: We are relying on setdefault() being atomic. This is true 777 # in CPython but we haven't investigated others. This warning appears 778 # in several other locations in this file. 779 field_value = self._fields.setdefault(field, field_value) 780 return field_value
Updates the linear constraint matrix, both for existing and new variables/linear constraints.
Requirements:
- linear_constraint_matrix_updates.row_ids are linear constraint ids, either existing or new.
- linear_constraint_matrix_updates.column_ids are variables ids, either existing or new.
- Matrix entries are unchanged if the (constraint, variable) pair is existing and unset.
- Matrix entries are zero if either the constraint or variable is new and the (constraint, variable) pair is unset.
- Zero values delete existing entries, and have no effect for new entries.
- linear_constraint_matrix.values must all be finite.
767 def getter(self): 768 field_value = self._fields.get(field) 769 if field_value is None: 770 # Construct a new object to represent this field. 771 field_value = field._default_constructor(self) 772 773 # Atomically check if another thread has preempted us and, if not, swap 774 # in the new object we just created. If someone has preempted us, we 775 # take that object and discard ours. 776 # WARNING: We are relying on setdefault() being atomic. This is true 777 # in CPython but we haven't investigated others. This warning appears 778 # in several other locations in this file. 779 field_value = self._fields.setdefault(field, field_value) 780 return field_value
Updates the quadratic constraints (addition and deletion only).
767 def getter(self): 768 field_value = self._fields.get(field) 769 if field_value is None: 770 # Construct a new object to represent this field. 771 field_value = field._default_constructor(self) 772 773 # Atomically check if another thread has preempted us and, if not, swap 774 # in the new object we just created. If someone has preempted us, we 775 # take that object and discard ours. 776 # WARNING: We are relying on setdefault() being atomic. This is true 777 # in CPython but we haven't investigated others. This warning appears 778 # in several other locations in this file. 779 field_value = self._fields.setdefault(field, field_value) 780 return field_value
Updates the second-order cone constraints (addition and deletion only).
767 def getter(self): 768 field_value = self._fields.get(field) 769 if field_value is None: 770 # Construct a new object to represent this field. 771 field_value = field._default_constructor(self) 772 773 # Atomically check if another thread has preempted us and, if not, swap 774 # in the new object we just created. If someone has preempted us, we 775 # take that object and discard ours. 776 # WARNING: We are relying on setdefault() being atomic. This is true 777 # in CPython but we haven't investigated others. This warning appears 778 # in several other locations in this file. 779 field_value = self._fields.setdefault(field, field_value) 780 return field_value
Updates the general constraints (addition and deletion only).
767 def getter(self): 768 field_value = self._fields.get(field) 769 if field_value is None: 770 # Construct a new object to represent this field. 771 field_value = field._default_constructor(self) 772 773 # Atomically check if another thread has preempted us and, if not, swap 774 # in the new object we just created. If someone has preempted us, we 775 # take that object and discard ours. 776 # WARNING: We are relying on setdefault() being atomic. This is true 777 # in CPython but we haven't investigated others. This warning appears 778 # in several other locations in this file. 779 field_value = self._fields.setdefault(field, field_value) 780 return field_value
Getter for sos2_constraint_updates.
767 def getter(self): 768 field_value = self._fields.get(field) 769 if field_value is None: 770 # Construct a new object to represent this field. 771 field_value = field._default_constructor(self) 772 773 # Atomically check if another thread has preempted us and, if not, swap 774 # in the new object we just created. If someone has preempted us, we 775 # take that object and discard ours. 776 # WARNING: We are relying on setdefault() being atomic. This is true 777 # in CPython but we haven't investigated others. This warning appears 778 # in several other locations in this file. 779 field_value = self._fields.setdefault(field, field_value) 780 return field_value
Getter for indicator_constraint_updates.
1302 def FindInitializationErrors(self): 1303 """Finds required fields which are not initialized. 1304 1305 Returns: 1306 A list of strings. Each string is a path to an uninitialized field from 1307 the top-level message, e.g. "foo.bar[5].baz". 1308 """ 1309 1310 errors = [] # simplify things 1311 1312 for field in required_fields: 1313 if not self.HasField(field.name): 1314 errors.append(field.name) 1315 1316 for field, value in self.ListFields(): 1317 if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: 1318 if field.is_extension: 1319 name = '(%s)' % field.full_name 1320 else: 1321 name = field.name 1322 1323 if _IsMapField(field): 1324 if _IsMessageMapField(field): 1325 for key in value: 1326 element = value[key] 1327 prefix = '%s[%s].' % (name, key) 1328 sub_errors = element.FindInitializationErrors() 1329 errors += [prefix + error for error in sub_errors] 1330 else: 1331 # ScalarMaps can't have any initialization errors. 1332 pass 1333 elif field.label == _FieldDescriptor.LABEL_REPEATED: 1334 for i in range(len(value)): 1335 element = value[i] 1336 prefix = '%s[%d].' % (name, i) 1337 sub_errors = element.FindInitializationErrors() 1338 errors += [prefix + error for error in sub_errors] 1339 else: 1340 prefix = name + '.' 1341 sub_errors = value.FindInitializationErrors() 1342 errors += [prefix + error for error in sub_errors] 1343 1344 return errors
Finds required fields which are not initialized.
Returns:
A list of strings. Each string is a path to an uninitialized field from the top-level message, e.g. "foo.bar[5].baz".
Inherited Members
- google.protobuf.message.Message
- CopyFrom
- ParseFromString
- HasExtension
- ClearExtension
- UnknownFields