docs: def make_repr(self, attrs):
      """Construct a repr string.
  
      If `config.REPR_VERBOSITY` is ``1`` or ``2``, this function calls the
      object's __str__ method. Although this breaks the convention that __repr__
      should return a string which can reconstruct the object, readable reprs are
      invaluable since the Python interpreter calls `repr` to represent all
      objects in the shell. Since PyPhi is often used in the interpreter we want
      to have meaningful and useful representations.
  
      Args:
          self (obj): The object in question
          attrs (Iterable[str]): Attributes to include in the repr
  
      Returns:
          str: the ``repr``esentation of the object
      """
      # TODO: change this to a closure so we can do
      # __repr__ = make_repr(attrs) ???
  
      if config.REPR_VERBOSITY in [MEDIUM, HIGH]:
          return self.__str__()
  
      elif config.REPR_VERBOSITY is LOW:
          return '{}({})'.format(
              self.__class__.__name__,
              ', '.join(attr + '=' + repr(getattr(self, attr))
                        for attr in attrs))
  
      raise ValueError('Invalid value for `config.REPR_VERBOSITY`')