code: def __call__(self, f):
      @functools.wraps(f)
      def _f(*args, **kwargs):
          obj_iter = itertools.chain(args, compat.itervalues(kwargs))
          if any(self.check(obj) for obj in obj_iter):
              msg = "reduction operation {name!r} not allowed for this dtype"
              raise TypeError(
                  msg.format(name=f.__name__.replace("nan", ""))
              )
          try:
              with np.errstate(invalid="ignore"):
                  return f(*args, **kwargs)
          except ValueError as e:
              # we want to transform an object array
              # ValueError message to the more typical TypeError
              # e.g. this is normally a disallowed function on
              # object arrays that contain strings
              if is_object_dtype(args[0]):
                  raise TypeError(e)
              raise
  
      return _f
  
imports: from distutils.version import LooseVersion
  import functools
  import itertools
  import operator
  import warnings
  import numpy
  from pandas._libs import iNaT, lib, tslibs
  import pandas.compat
  from pandas.core.dtypes.cast import _int64_max, maybe_upcast_putmask
  from pandas.core.dtypes.common import _get_dtype, is_any_int_dtype, is_bool_dtype, is_complex, is_complex_dtype, is_datetime64_dtype, is_datetime64tz_dtype, is_datetime_or_timedelta_dtype, is_float, is_float_dtype, is_integer, is_integer_dtype, is_numeric_dtype, is_object_dtype, is_scalar, is_timedelta64_dtype, pandas_dtype
  from pandas.core.dtypes.dtypes import DatetimeTZDtype
  from pandas.core.dtypes.missing import isna, na_value_for_dtype, notna
  import pandas.core.common
  from pandas.core.config import get_option
label_desc: Use image node_id 3 for calling the disallow obj's underlying member method code with example usage: obj.__call__(f) and returns: _f, f