def METHOD_NAME(
    self, step_name: str, task_index: int, task_num: int | None = None
) -> StepResult:
    _step = self._steps[step_name]
    if task_num is None or task_num <= 0:
        task_num = _step.task_num
    if task_index >= task_num:
        raise RuntimeError(
            f"task_index:{task_index} out of bounds, task_num:{task_num}"
        )
    _task = TaskExecutor(
        index=task_index,
        context=Context(
            project=self.project,
            version=self.version,
            step=_step.name,
            total=task_num,
            index=task_index,
            dataset_uris=self.dataset_uris,
            workdir=self.workdir,
        ),
        step=_step,
        workdir=self.workdir,
    )
    start_time = time.time()
    task_result: TaskResult = _task.execute()
    console.info(
        f"step:{step_name}, task result:{task_result}, run time:{time.time() - start_time}"
    )
    return StepResult(name=step_name, task_results=[task_result])