docs: def suitability_as_key(self, key_name):
          """
          Returns: (result, key_type)
          ``result`` is True, False, or 'absent' or 'partial' (both still usable)
          ``key_type`` is ``int`` for integer keys or ``str`` for hash keys
  
          """
          pk_values = all_values_for(self, key_name)
          if not pk_values:
              return ('absent', int)  # could still use it
          key_type = type(th.best_coercable(pk_values))
          num_unique_values = len(set(pk_values))
          if num_unique_values < len(pk_values):
              return (False, None)     # non-unique
          if num_unique_values == len(self):
              return (True, key_type)  # perfect!
          return ('partial', key_type)