code: def get_display_name(
      self, cache: bool = True, shorten: bool = False, **kwargs
  ) -> str:
      if self.cached_display_name is not None and cache:
          return self.cached_display_name
  
      if self.alias:
          components = ["f_autofe", self.alias]
      elif shorten and not self.op.is_unary:
          components = [
              "f_autofe",
              self.op.alias or self.op.name.lower(),
          ]
      else:
          components = [
              "f_" + "_f_".join(self.get_columns(**kwargs))
          ] + [
              "autofe",
              self.op.alias or self.op.name.lower(),
          ]
      components.extend(
          [str(self.display_index)]
          if self.display_index is not None
          else []
      )
      display_name = "_".join(components)
  
      if cache:
          self.cached_display_name = display_name
      return display_name
  
imports: import hashlib
  import itertools
  from typing import Dict, List, Optional, Tuple, Union
  import numpy
  import pandas
  from pandas._typing import DtypeObj
  from upgini.autofe.all_operands import find_op
  from upgini.autofe.operand import Operand, PandasOperand
label_desc: Use image node_id 9 for calling the Feature obj's underlying member method code with example usage: obj.get_display_name(cache, shorten) and returns: display_name, self