class TableFormatter: def headings(self, headers): raise NotImplementedError() def row(self, rowdata): raise NotImplementedError() class TextTableFormatter: def _printer(self, data): print(*("{: >10}".format(value) for value in data)) def headings(self, headers): self._printer(headers) print(*("{:->10}".format("") for _ in headers)) def row(self, rowdata): self._printer(rowdata) class CSVTableFormatter: def _printer(self, data): print(",".join(str(value) for value in data)) def headings(self, headers): return self._printer(headers) def row(self, rowdata): return self._printer(rowdata) class HTMLTableFormatter: def _cell(self, value, tag): return f"<{tag}>{value}{tag}>" def _printer(self, data, tag): line = f"