def update_info(self, info):
for key in self._info_fields:<EOL><INDENT>value = getattr(self, key, None)<EOL>idx = _get_info(info, self.name)<EOL>existing_value = idx.get(key)<EOL>if key in idx and value is not None and existing_value != value:<EOL><INDENT>if key in ['<STR_LIT>', '<STR_LIT>']:<EOL><INDENT>ws = attribute_conflict_doc % (key, existing_value, value)<EOL>warnings.warn(ws, AttributeConflictWarning, stacklevel=<NUM_LIT:6>)<EOL>idx[key] = None<EOL>setattr(self, key, None)<EOL><DEDENT>else:<EOL><INDENT>raise ValueError(<EOL>"<STR_LIT>"<EOL>"<STR_LIT>"<EOL>"<STR_LIT>".format(<EOL>name=self.name, key=key,<EOL>existing_value=existing_value, value=value))<EOL><DEDENT><DEDENT>else:<EOL><INDENT>if value is not None or existing_value is not None:<EOL><INDENT>idx[key] = value<EOL><DEDENT><DEDENT><DEDENT>return self<EOL>
set/update the info for this indexable with the key/value
            if there is a conflict raise/warn as needed