docs: def short_repr(obj, noneAsNA=False):
      '''Return a short representation of obj for clarity.'''
      if obj is None:
          return 'unspecified' if noneAsNA else 'None'
      elif isinstance(obj, str) and len(obj) > 80:
          return '{}...{}'.format(obj[:60].replace('\n', '\\n'),
                                  obj[-20:].replace('\n', '\\n'))
      elif isinstance(obj, (str, int, float, bool)):
          return repr(obj)
      elif hasattr(obj, '__short_repr__'):
          return obj.__short_repr__()
      elif isinstance(obj, Sequence):  # should be a list or tuple
          if len(obj) == 0:
              return '[]'
          elif len(obj) == 1:
              return f'{short_repr(obj[0])}'
          elif len(obj) == 2:
              return f'{short_repr(obj[0])}, {short_repr(obj[1])}'
          else:
              return f'{short_repr(obj[0])}, {short_repr(obj[1])}, ... ({len(obj)} items)'
      elif isinstance(obj, dict):
          if not obj:
              return ''
          elif len(obj) == 1:
              first_key = list(obj.keys())[0]
              return f'{short_repr(first_key)!r}:{short_repr(obj[first_key])!r}'
          else:
              first_key = list(obj.keys())[0]
              return f'{short_repr(first_key)}:{short_repr(obj[first_key])}, ... ({len(obj)} items)'
      elif isinstance(obj, KeysView):
          if not obj:
              return ''
          elif len(obj) == 1:
              return short_repr(next(iter(obj)))
          else:
              return f'{short_repr(next(iter(obj)))}, ... ({len(obj)} items)'
      #elif hasattr(obj, 'target_name'):
      #    return obj.target_name()
      else:
          ret = str(obj)
          if len(ret) > 40:
              return f'{repr(obj)[:35]}...'
          else:
              return ret