class_docstr: Base class for all step decorators.
  
  Example:
  
  @my_decorator
  @step
  def a(self):
      pass
  
  @my_decorator
  @step
  def b(self):
      pass
  
  To make the above work, define a subclass
  
  class MyDecorator(StepDecorator):
      name = "my_decorator"
  
  and include it in plugins.STEP_DECORATORS. Now both a() and b()
  get an instance of MyDecorator, so you can keep step-specific
  state easily.
  
  TODO (savin): Initialize the decorators with flow, graph,
                step.__name__ etc., so that we don't have to
                pass them around with every lifecycle call.
class_docstr_tok: ["Base","class","for","all","step","decorators",".","Example",":","@","my_decorator","@","step","def","a","(","self",")",":","pass","@","my_decorator","@","step","def","b","(","self",")",":","pass","To","make","the","above","work",",","define","a","subclass","class","MyDecorator","(","StepDecorator",")",":","name","=","``","my_decorator","''","and","include","it","in","plugins.STEP_DECORATORS",".","Now","both","a","(",")","and","b","(",")","get","an","instance","of","MyDecorator",",","so","you","can","keep","step-specific","state","easily",".","TODO","(","savin",")",":","Initialize","the","decorators","with","flow",",","graph",",","step.__name__","etc.",",","so","that","we","do","n't","have","to","pass","them","around","with","every","lifecycle","call","."]
docstr: Called to determine the number of times this task should be retried.
  Returns a tuple of (user_code_retries, error_retries). Error retries
  are attempts to run the process after the user code has failed all
  its retries.
  
  Typically, the runtime takes the maximum of retry counts across
  decorators and user specification to determine the task retry count.
  If you want to force no retries, return the special values (None, None).
code: def step_task_retry_count(self):
      """
      Called to determine the number of times this task should be retried.
      Returns a tuple of (user_code_retries, error_retries). Error retries
      are attempts to run the process after the user code has failed all
      its retries.
  
      Typically, the runtime takes the maximum of retry counts across
      decorators and user specification to determine the task retry count.
      If you want to force no retries, return the special values (None, None).
      """
      return 0, 0
  
imports: from functools import partial
  import json
  import re
  import os
  import sys
  from .flowspec import FlowSpec
  from .exception import MetaflowInternalError, MetaflowException, InvalidDecoratorAttribute
  from metaflow._vendor import click
label_desc: Use image node_id 4 for calling the StepDecorator obj's underlying member method code with example usage: obj.step_task_retry_count() and returns: int,  int