def __init__(self, wf_spec, name, **kwargs):
assert wf_spec is not None<EOL>assert name is not None<EOL>self._wf_spec = wf_spec<EOL>self.id = None<EOL>self.name = str(name)<EOL>self.description = kwargs.get('<STR_LIT:description>', '<STR_LIT>')<EOL>self.inputs = []<EOL>self.outputs = []<EOL>self.manual = kwargs.get('<STR_LIT>', False)<EOL>self.internal = False  <EOL>self.data = kwargs.get('<STR_LIT:data>',        {})<EOL>self.defines = kwargs.get('<STR_LIT>',     {})<EOL>self.pre_assign = kwargs.get('<STR_LIT>',  [])<EOL>self.post_assign = kwargs.get('<STR_LIT>', [])<EOL>self.locks = kwargs.get('<STR_LIT>',        [])<EOL>self.lookahead = <NUM_LIT:2>  <EOL>self.entered_event = Event()<EOL>self.reached_event = Event()<EOL>self.ready_event = Event()<EOL>self.completed_event = Event()<EOL>self.cancelled_event = Event()<EOL>self.finished_event = Event()<EOL>self._wf_spec._add_notify(self)<EOL>self.data.update(self.defines)<EOL>assert self.id is not None<EOL>
Constructor.

The difference between the assignment of a data value using
the data argument versus pre_assign and post_assign is that
changes made using data are task-local, i.e. they are
not visible to other tasks.
Similarly, "defines" are spec data fields that, once defined, can
no longer be modified.

:type  wf_spec: WorkflowSpec
:param wf_spec: A reference to the workflow specification that owns it.
:type  name: string
:param name: A name for the task.
:type  lock: list(str)
:param lock: A list of mutex names. The mutex is acquired
             on entry of execute() and released on leave of
             execute().
:type  manual: bool
:param manual: Whether this task requires a manual action to complete.
:type  data: dict((str, object))
:param data: name/value pairs
:type  defines: dict((str, object))
:param defines: name/value pairs
:type  pre_assign: list((str, object))
:param pre_assign: a list of name/value pairs
:type  post_assign: list((str, object))
:param post_assign: a list of name/value pairs