class_docstr: A decorator to take a function's docstring and perform string
  substitution on it.
  
  This decorator should be robust even if func.__doc__ is None
  (for example, if -OO was passed to the interpreter)
  
  Usage: construct a docstring.Substitution with a sequence or
  dictionary suitable for performing substitution; then
  decorate a suitable function with the constructed object. e.g.
  
  sub_author_name = Substitution(author='Jason')
  
  @sub_author_name
  def some_function(x):
      "%(author)s wrote this function"
  
  # note that some_function.__doc__ is now "Jason wrote this function"
  
  One can also use positional arguments.
  
  sub_first_last_names = Substitution('Edgar Allen', 'Poe')
  
  @sub_first_last_names
  def some_function(x):
      "%s %s wrote the Raven"
code: def __init__(self, *args, **kwargs) -> None:
      if args and kwargs:
          raise AssertionError(
              "Only positional or keyword args are allowed"
          )
  
      self.params = args or kwargs
  
imports: from __future__ import annotations
  from functools import wraps
  import inspect
  from textwrap import dedent
  from typing import Any, Callable, Mapping, cast
  import warnings
  from pandas._libs.properties import cache_readonly
  from pandas._typing import F, T
  from pandas.util._exceptions import find_stack_level
label_desc: Use image node_id 1 to create a new Substitution object  with example: obj = Substitution()