code: def _repr_html_(self):
          
          fmt = ""
          fmt += "<table>"
          fmt += "<tr><th>Information</th><th>Blocks</th></tr>"
          fmt += "<tr><td>"
          fmt += "\n"
          fmt += "<table>\n"
          fmt += "<tr><th>{}</th><th>Values</th></tr>\n".format(type(self).__name__)
          row = "<tr><td>{}</td><td>{}</td></tr>\n"
  
          # now make a call on the object to get its attributes as a list of len 2 tuples
          for attr in self._get_attrs():
              try:
                  fmt += row.format(attr[0], attr[2].format(*attr[1]))
              except:
                  fmt += row.format(attr[0], attr[2].format(attr[1]))
  
          fmt += "</table>\n"
          fmt += "\n"
          fmt += "</td><td>"
          fmt += "\n"
          fmt += "<table>\n"
          row = "<tr><th>{}</th><th>{}</th><th>{}</th></tr>\n"
          fmt += row.format("Index", "Name", "Type")
  
          for i in range(self.n_blocks):
              data = self[i]
              fmt += row.format(i, self.get_block_name(i), type(data).__name__)
  
          fmt += "</table>\n"
          fmt += "\n"
          fmt += "</td></tr> </table>"
          return fmt
docs: A pretty representation for Jupyter notebooks