class_docstr: Configuration object defines retry behaviour and is composed of these fields:
      * `retriable` - function that decides if an exception should trigger retrying
      * `get_delay` - function that returns a number of seconds retrier must wait before doing the next attempt
      * `max_time` - maximum `datetime.timedelta` that can pass after the first call for any retry attempt to be done
      * `max_times` - maximum number of retry attempts (note retries, not tries/calls)
      * `handle_error` - function that is called for each failed call attempt
      * `logger` - logger object to record retry warnings with
      * `sleep` - custom sleep function to use for waiting
  
  >>> RetryConf(max_time=datetime.timedelta(seconds=30), max_times=10)
  
  Empty configuration retries indefinitely on any exceptions raised.
  
  By default `DEFAULT_CONF` if used, which retries indefinitely, waiting 1 sec with 1.2 backoff between attempts, and
  also logging with built-in logger object.
  
  Configuration must be cloned before modification to create separate configuration:
  
  >>> DEFAULT_CONF.clone()
  
  There are various methods that provide convenient clone-and-modify shortcuts and "retry recipes".
class_docstr_tok: ["Configuration","object","defines","retry","behaviour","and","is","composed","of","these","fields",":","*","`","retriable","`","-","function","that","decides","if","an","exception","should","trigger","retrying","*","`","get_delay","`","-","function","that","returns","a","number","of","seconds","retrier","must","wait","before","doing","the","next","attempt","*","`","max_time","`","-","maximum","`","datetime.timedelta","`","that","can","pass","after","the","first","call","for","any","retry","attempt","to","be","done","*","`","max_times","`","-","maximum","number","of","retry","attempts","(","note","retries",",","not","tries\/calls",")","*","`","handle_error","`","-","function","that","is","called","for","each","failed","call","attempt","*","`","logger","`","-","logger","object","to","record","retry","warnings","with","*","`","sleep","`","-","custom","sleep","function","to","use","for","waiting",">",">",">","RetryConf","(","max_time=datetime.timedelta","(","seconds=30",")",",","max_times=10",")","Empty","configuration","retries","indefinitely","on","any","exceptions","raised",".","By","default","`","DEFAULT_CONF","`","if","used",",","which","retries","indefinitely",",","waiting","1","sec","with","1.2","backoff","between","attempts",",","and","also","logging","with","built-in","logger","object",".","Configuration","must","be","cloned","before","modification","to","create","separate","configuration",":",">",">",">","DEFAULT_CONF.clone","(",")","There","are","various","methods","that","provide","convenient","clone-and-modify","shortcuts","and","``","retry","recipes","''","."]
code: def __init__(self, **kwargs):
      for prop, default_value in self._PROPS.items():
          setattr(self, prop, default_value)
      self._set(**kwargs)
  
imports: import copy
  import datetime
  import functools
  import itertools
  import logging
  import random
  import time
label_desc: Use image node_id 1 to create a new RetryConf object from inherited base classes: object with example: obj = RetryConf()