code: def __getitem__(self, index):
      # Don't use this this data structure if you plan to do a lot of indexing, it is
      # very inefficient! Use a PVector instead!
  
      if isinstance(index, slice):
          if (
              index.start is not None
              and index.stop is None
              and (index.step is None or index.step == 1)
          ):
              return self._drop(index.start)
  
          # Take the easy way out for all other slicing cases, not much structural reuse possible anyway
          return plist(tuple(self)[index])
  
      if not isinstance(index, Integral):
          raise TypeError(
              "'%s' object cannot be interpreted as an index"
              % type(index).__name__
          )
  
      if index < 0:
          # NB: O(n)!
          index += len(self)
  
      try:
          return self._drop(index).first
      except AttributeError:
          raise IndexError("PList index out of range")
  
imports: from ._compat import Sequence, Hashable
  from numbers import Integral
  from functools import reduce
label_desc: Use image node_id 11 for calling the _PListBase obj's underlying member method code with example usage: obj.__getitem__(index) and returns: plist, self, self