code: def monitor(f, input="print", output="print"):
      """
      Returns a wrapped copy of *f* that monitors evaluation by calling
      *input* with every input (*args*, *kwargs*) passed to *f* and
      *output* with every value returned from *f*. The default action
      (specify using the special string value ``'print'``) is to print
      inputs and outputs to stdout, along with the total evaluation
      count::
  
          >>> from mpmath import *
          >>> mp.dps = 5; mp.pretty = False
          >>> diff(monitor(exp), 1)   # diff will eval f(x-h) and f(x+h)
          in  0 (mpf('0.99999999906867742538452148'),) {}
          out 0 mpf('2.7182818259274480055282064')
          in  1 (mpf('1.0000000009313225746154785'),) {}
          out 1 mpf('2.7182818309906424675501024')
          mpf('2.7182808')
  
      To disable either the input or the output handler, you may
      pass *None* as argument.
  
      Custom input and output handlers may be used e.g. to store
      results for later analysis::
  
          >>> mp.dps = 15
          >>> input = []
          >>> output = []
          >>> findroot(monitor(sin, input.append, output.append), 3.0)
          mpf('3.1415926535897932')
          >>> len(input)  # Count number of evaluations
          9
          >>> print(input[3]); print(output[3])
          ((mpf('3.1415076583334066'),), {})
          8.49952562843408e-5
          >>> print(input[4]); print(output[4])
          ((mpf('3.1415928201669122'),), {})
          -1.66577118985331e-7
  
      """
      if not input:
          input = lambda v: None
      elif input == "print":
          incount = [0]
  
          def input(value):
              args, kwargs = value
              print("in  %s %r %r" % (incount[0], args, kwargs))
              incount[0] += 1
  
      if not output:
          output = lambda v: None
      elif output == "print":
          outcount = [0]
  
          def output(value):
              print("out %s %r" % (outcount[0], value))
              outcount[0] += 1
  
      def f_monitored(*args, **kwargs):
          input((args, kwargs))
          v = f(*args, **kwargs)
          output(v)
          return v
  
      return f_monitored
  
label_desc: Use image node_id 1 for calling a global function with example usage: monitor(f, input, output) and returns: f_monitored, v