code: def summary(self, recurse=False):
          
          six.print_('Table summary:', self.name())
          six.print_('Shape:', self.ncols(), 'columns by', self.nrows(), 'rows')
          six.print_('Info:', self.info())
          tkeys = self.getkeywords()
          if (len(tkeys) > 0):
              six.print_('Table keywords:', tkeys)
          columns = self.colnames()
          if (len(columns) > 0):
              six.print_('Columns:', columns)
              for column in columns:
                  ckeys = self.getcolkeywords(column)
                  if (len(ckeys) > 0):
                      six.print_(column, 'keywords:', ckeys)
          if (recurse):
              for key, value in tkeys.items():
                  tabname = _remove_prefix(value)
                  six.print_('Summarizing subtable:', tabname)
                  lt = table(tabname)
                  if (not lt.summary(recurse)):
                      break
          return True
docs: Print a summary of the table.
  
          It prints the number of columns and rows, column names, and table and
          column keywords.
          If `recurse=True` it also prints the summary of all subtables, i.e.
          tables referenced by table keywords.