This commit is contained in:
Mike Bloy 2023-10-28 18:55:25 -05:00
parent 1618e42cbb
commit 704290b1a2
2 changed files with 69 additions and 5 deletions

7
ex35.py Normal file
View File

@ -0,0 +1,7 @@
import reader
import stock
import tableformat
portfolio = reader.read_csv_as_instances("Data/portfolio.csv", stock.Stock)
formatter = tableformat.create_formatter("text")
tableformat.print_table(portfolio, ["name", "shares", "price"], formatter)

View File

@ -1,5 +1,62 @@
def print_table(objects, attributes):
print(*("{: >10}".format(attr) for attr in attributes))
print(*("{:->10}".format("") for _ in attributes))
for obj in objects:
print(*("{: >10}".format(getattr(obj, attr, "")) for attr in attributes))
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"<tr>{' '.join(self._cell(str(value), tag) for value in data)}</tr>"
print(line)
def headings(self, headers):
return self._printer(headers, "th")
def row(self, rowdata):
return self._printer(rowdata, "td")
def create_formatter(name):
formatters = {
"text": TextTableFormatter,
"csv": CSVTableFormatter,
"html": HTMLTableFormatter,
}
formatter = formatters.get(name, None)
if not name:
raise ValueError(f'formatter named "{name}" not implemented')
return formatter()
def print_table(records, fields, formatter):
formatter.headings(fields)
for record in records:
formatter.row([getattr(record, fieldname) for fieldname in fields])