class_docstr: Function wrapper to replace ``**settings`` in the signature with printer defaults
code: def __init__(self, f, print_cls: Type[Printer]):
      # find all the non-setting arguments
      params = list(inspect.signature(f).parameters.values())
      assert params.pop(-1).kind == inspect.Parameter.VAR_KEYWORD
      self.__other_params = params
  
      self.__print_cls = print_cls
      update_wrapper(self, f)
  
imports: from __future__ import annotations
  import sys
  from typing import Any, Type
  import inspect
  from contextlib import contextmanager
  from functools import cmp_to_key, update_wrapper
  from sympy.core.add import Add
  from sympy.core.basic import Basic
  from sympy.core.function import AppliedUndef, UndefinedFunction, Function
label_desc: Use image node_id 1 to create a new _PrintFunction object  with example: obj = _PrintFunction(f, print_cls)