class_docstr: Abstract class for logical operators performing a UDF that should be converted
  to physical MapOperator.
docstr: Gets the Operator name including the map `fn` UDF name.
docstr_tok: ["Gets","the","Operator","name","including","the","map","`","fn","`","UDF","name","."]
code: def _get_operator_name(self, op_name: str, fn: UserDefinedFunction):
      """Gets the Operator name including the map `fn` UDF name."""
      # If the input `fn` is a Preprocessor, the
      # name is simply the name of the Preprocessor class.
      if inspect.ismethod(fn) and isinstance(fn.__self__, Preprocessor):
          return fn.__self__.__class__.__name__
  
      # Otherwise, it takes the form of `<MapOperator class>(<UDF name>)`,
      # e.g. `MapBatches(my_udf)`.
      try:
          if inspect.isclass(fn):
              # callable class
              return f"{op_name}({fn.__name__})"
          elif inspect.ismethod(fn):
              # class method
              return f"{op_name}({fn.__self__.__class__.__name__}.{fn.__name__})"
          elif inspect.isfunction(fn):
              # normal function or lambda function.
              return f"{op_name}({fn.__name__})"
          else:
              # callable object.
              return f"{op_name}({fn.__class__.__name__})"
      except AttributeError as e:
          logger.get_logger().error(
              "Failed to get name of UDF %s: %s", fn, e
          )
          return "<unknown>"
  
imports: import inspect
  from typing import Any, Dict, Iterable, Optional, Union
  from ray.data._internal.compute import ComputeStrategy, TaskPoolStrategy
  from ray.data._internal.dataset_logger import DatasetLogger
  from ray.data._internal.logical.interfaces import LogicalOperator
  from ray.data._internal.logical.operators.one_to_one_operator import AbstractOneToOne
  from ray.data.block import UserDefinedFunction
  from ray.data.context import DEFAULT_BATCH_SIZE
  from ray.data.preprocessor import Preprocessor
label_desc: Use image node_id 2 for calling the AbstractUDFMap obj's underlying member method code with example usage: obj._get_operator_name(op_name, fn) and returns: fn, op_name, str, fn, str, str, op_name, str, fn, str, fn, str, op_name, str, fn, str, op_name, str, fn, str