docs: def _render_objects(self, items, attributes=None, datatype='object'):
      """Renders an HTML table with the specified list of objects.
  
      Args:
        items: the iterable collection of objects to render.
        attributes: the optional list of properties or keys to render.
        datatype: the type of data; one of 'object' for Python objects, 'dict' for a list
            of dictionaries, or 'chartdata' for Google chart data.
      """
      if not items:
        return
  
      if datatype == 'chartdata':
        if not attributes:
          attributes = [items['cols'][i]['label'] for i in range(0, len(items['cols']))]
        items = items['rows']
        indices = {attributes[i]: i for i in range(0, len(attributes))}
  
      num_segments = len(self._segments)
      self._segments.append('<table>')
  
      first = True
      for o in items:
        if first:
          first = False
          if datatype == 'dict' and not attributes:
            attributes = list(o.keys())
  
          if attributes is not None:
            self._segments.append('<tr>')
            for attr in attributes:
              self._segments.append('<th>%s</th>' % attr)
            self._segments.append('</tr>')
  
        self._segments.append('<tr>')
        if attributes is None:
          self._segments.append('<td>%s</td>' % HtmlBuilder._format(o))
        else:
          for attr in attributes:
            if datatype == 'dict':
              self._segments.append('<td>%s</td>' % HtmlBuilder._format(o.get(attr, None), nbsp=True))
            elif datatype == 'chartdata':
              self._segments.append('<td>%s</td>' % HtmlBuilder._format(o['c'][indices[attr]]['v'],
                                                                        nbsp=True))
            else:
              self._segments.append('<td>%s</td>' % HtmlBuilder._format(o.__getattribute__(attr),
                                                                        nbsp=True))
  
        self._segments.append('</tr>')
  
      self._segments.append('</table>')
      if first:
        # The table was empty; drop it from the segments.
        self._segments = self._segments[:num_segments]