docs: def get_hyperedge_attributes(self, hyperedge_id):
          """Given a hyperedge ID, get a dictionary of copies of that hyperedge's
          attributes.
  
          :param hyperedge_id: ID of the hyperedge to retrieve the attributes of.
          :returns: dict -- copy of each attribute of the specified hyperedge_id
                  (except the private __frozen_nodes entry).
          :raises: ValueError -- No such hyperedge exists.
  
          """
          if not self.has_hyperedge_id(hyperedge_id):
              raise ValueError("No such hyperedge exists.")
          dict_to_copy = self._hyperedge_attributes[hyperedge_id].items()
          attributes = {}
          for attr_name, attr_value in dict_to_copy:
              if attr_name != "__frozen_nodes":
                  attributes[attr_name] = copy.copy(attr_value)
          return attributes