ex35
This commit is contained in:
parent
1618e42cbb
commit
704290b1a2
7
ex35.py
Normal file
7
ex35.py
Normal 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)
|
||||
@ -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])
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user