docs: def get_step_input(section, default_input):
      '''Find step input
      '''
      step_input: sos_targets = sos_targets()
      dynamic_input = True
  
      # look for input statement.
      input_idx = find_statement(section, 'input')
      if input_idx is None:
          return step_input, dynamic_input
  
      # input statement
      stmt = section.statements[input_idx][2]
      try:
          svars = ['output_from', 'named_output', 'sos_step', 'sos_variable']
          old_values = {
              x: env.sos_dict.dict()[x]
              for x in svars
              if x in env.sos_dict.dict()
          }
          env.sos_dict.quick_update({
              'output_from': lambda *args, **kwargs: None,
              'named_output': lambda *args, **kwargs: None,
              'traced': lambda *args, **kwargs: sos_targets(*args, **kwargs),
              'sos_step': no_sos_step,
              'sos_variable': no_sos_variable,
          })
          args, kwargs = SoS_eval(
              f'__null_func__({stmt})', extra_dict=env.sos_dict.dict())
          if not args:
              if default_input is None:
                  step_input = sos_targets()
              else:
                  step_input = default_input
          elif not any(isinstance(x, (dynamic, remote)) for x in args):
              step_input = sos_targets(*args)
      except SyntaxError:
          raise
      except Exception as e:
          # if anything is not evalutable, keep Undetermined
          env.logger.debug(
              f'Input of step {section.name if section.index is None else f"{section.name}_{section.index}"} is set to Undertermined: {e}'
          )
          # expression ...
          step_input = sos_targets(_undetermined=stmt)
      finally:
          [env.sos_dict.dict().pop(x) for x in svars]
          env.sos_dict.quick_update(old_values)
      return step_input, dynamic_input