code: def __init__(
      self,
      name: str,
      display_name: str,
      description: str,
      job_settings: _JobSettings,
      cache_config: Optional[CacheConfig] = None,
      retry_policies: Optional[List[RetryPolicy]] = None,
      depends_on: Optional[
          List[Union[Step, StepCollection, StepOutput]]
      ] = None,
      func: Callable = None,
      func_args: tuple = (),
      func_kwargs: dict = None,
  ):
      super(CustomFunctionStep, self).__init__(
          name,
          StepTypeEnum.TRAINING,
          display_name,
          description,
          depends_on,
          retry_policies,
      )
  
      self.func = func
      self.func_args = func_args
      self.func_kwargs = func_kwargs if func_kwargs else dict()
      self.cache_config = cache_config
      self.job_settings = job_settings
  
      self._properties = Properties(
          step_name=name, shape_name="DescribeTrainingJobResponse"
      )
  
imports: from __future__ import absolute_import
  from typing import List, Optional, Union, Callable
  from sagemaker.utils import base_from_name
  from sagemaker.workflow.properties import Properties
  from sagemaker.workflow.retry import RetryPolicy
  from sagemaker.workflow.step_outputs import StepOutput
  from sagemaker.workflow.steps import ConfigurableRetryStep, Step, StepTypeEnum, CacheConfig
  from sagemaker.workflow.step_collections import StepCollection
  from sagemaker.workflow.utilities import execute_job_functions
  from sagemaker.workflow.entities import RequestType
  from sagemaker.remote_function.job import _JobSettings
label_desc: Use image node_id 1 to create a new CustomFunctionStep object from inherited base classes: ConfigurableRetryStep with example: obj = CustomFunctionStep(name, display_name, description, job_settings, cache_config, retry_policies, depends_on, func, func_args, func_kwargs)