docs: def get_output_from_steps(stmt, last_step):
      '''
      Extract output_from(1), output_from('step_1'), and output_from([1, 2])
      to determine dependent steps
      '''
      opt_values = get_param_of_function(
          'output_from', stmt, extra_dict=env.sos_dict.dict())
  
      def step_name(val):
          if isinstance(val, str):
              return val
          elif isinstance(val, int):
              if val == -1:
                  if last_step is None:
                      # there is a case where a regular step is checked as auxiliary step.
                      # we will postpone the decision later because the step might not be
                      # used as such
                      return None
                  return last_step
              if '_' in env.sos_dict['step_name']:
                  return f"{env.sos_dict['step_name'].rsplit('_',1)[0]}_{val}"
              else:
                  return str(val)
          else:
              raise ValueError(f'Invalid value {val} for output_from() function')
  
      res = []
      for value in opt_values:
          if len(value) == 1:
              # regular argument
              value = value[0]
          elif value[0] == 'steps':
              value = value[1]
          elif value[0] in SOS_TARGETS_OPTIONS:
              continue
          else:
              raise ValueError(
                  f'Unacceptable keyword argument {value[0]} for function output_from'
              )
          if isinstance(value, (int, str)):
              res.append(step_name(value))
          elif isinstance(value, Sequence):
              res.extend([step_name(x) for x in value])
          else:
              raise ValueError(f'Invalid value for input option from {value}')
      return [x for x in res if x is not None]