docs: def row(self, rownum):
          """
          Returns the row at index `rownum`.
          ---
          Note that the DataRow object returned that represents the data row
          is constructed on the fly and is a just a shallow copy of
          the underlying data that does not update dynamically.
          """
          if rownum > len(self):
              raise IndexError("Invalid row index `%s` for DataTable" % rownum)
          return datarow_constructor(self.fields)([self[field][rownum]
                                                   for field in self.fields])