def step(self, dependency_states, step_context):
    # Request the product we need to compute the subject.
    input_node = self._input_node()
    input_state = dependency_states.get(input_node, None)
    if input_state is None or type(input_state) == Waiting:
      return Waiting([input_node])
    elif type(input_state) == Throw:
      return input_state
    elif type(input_state) == Noop:
      return Noop('Could not compute {} in order to project its fields.'.format(input_node))
    elif type(input_state) != Return:
      State.raise_unrecognized(input_state)

    # The input product is available: use it to construct the new Subject.
    input_product = input_state.value
    values = []
    for field in self.fields:
      values.append(getattr(input_product, field))

    # If there was only one projected field and it is already of the correct type, project it.
    if len(values) == 1 and type(values[0]) is self.projected_subject:
      projected_subject = values[0]
    else:
      projected_subject = self.projected_subject(*values)
    output_node = self._output_node(step_context, projected_subject)

    # When the output node is available, return its result.
    output_state = dependency_states.get(output_node, None)
    if output_state is None or type(output_state) == Waiting:
      return Waiting([input_node, output_node])
    elif type(output_state) == Noop:
      return Noop('Successfully projected, but no source of output product for {}.'.format(output_node))
    elif [Throw, Return] in type(output_state):
      return output_state
    else:
      raise State.raise_unrecognized(output_state)
dataset/ETHPy150Open pantsbuild/pants/src/python/pants/engine/exp/nodes.py/ProjectionNode.step/swapped operands of `in`