def remove(self, fields, pipe=None):
<EOL>if not fields:<EOL><INDENT>return<EOL><DEDENT>if self.key_name in fields:<EOL><INDENT>raise InvalidOperation('<STR_LIT>')<EOL><DEDENT>removed_required_fields = self.required.intersection(fields)<EOL>if len(removed_required_fields):<EOL><INDENT>raise InvalidOperation('<STR_LIT>'<EOL>% list(removed_required_fields))<EOL><DEDENT>with self._pipe(pipe) as pipe:<EOL><INDENT>core = self.core(pipe=pipe)<EOL>core.hdel(self.key, *fields)<EOL>self._expire(pipe=pipe)<EOL>def cb():<EOL><INDENT>"""<STR_LIT>"""<EOL>for k in fields:<EOL><INDENT>self._data.pop(k, None)<EOL><DEDENT><DEDENT>pipe.on_execute(cb)<EOL><DEDENT>
remove some fields from the struct.
This will remove data from the underlying redis hash object.
After the pipe executes successfully, it will also remove it from
the current instance of Struct.

:param fields: list or iterable, names of the fields to remove.
:param pipe: Pipeline, NestedPipeline, or None
:return: None