class_docstr: A dataset processing step.
  
  Attributes:
      name (str): The processing step name.
      input_type (InputType): The input type ('dataset', 'config' or 'split').
      job_runner_version (int): The version of the job runner to use to compute the response.
  
  Getters:
      cache_kind (str): The cache kind (ie. the key in the cache).
      job_type (str): The job type (ie. the job to run to compute the response).
class_docstr_tok: ["A","dataset","processing","step",".","Attributes",":","name","(","str",")",":","The","processing","step","name",".","input_type","(","InputType",")",":","The","input","type","(","'dataset","'",",","'config","'","or","'split","'",")",".","job_runner_version","(","int",")",":","The","version","of","the","job","runner","to","use","to","compute","the","response",".","Getters",":","cache_kind","(","str",")",":","The","cache","kind","(","ie",".","the","key","in","the","cache",")",".","job_type","(","str",")",":","The","job","type","(","ie",".","the","job","to","run","to","compute","the","response",")","."]
code: def __post_init__(self) -> None:
      self.cache_kind = self.name
      self.job_type = self.name
  
imports: from __future__ import annotations
  from collections.abc import Mapping
  from dataclasses import dataclass, field
  from typing import Any, Literal, Optional, TypedDict, Union, get_args
  import networkx
  from libcommon.constants import DEFAULT_DIFFICULTY, DEFAULT_INPUT_TYPE, DEFAULT_JOB_RUNNER_VERSION, MIN_BYTES_FOR_BONUS_DIFFICULTY
  from libcommon.utils import inputs_to_string
label_desc: Use image node_id 1 for calling the ProcessingStep obj's underlying member method code with example usage: obj.__post_init__() without return types