-2
我有一個解析數據到由許多不同的類組成的分層數據結構。現在,我想爲這些數據生成報告。我想支持多種輸出格式,所以我想將輸出後端與數據結構分開。Pythonic輸出後端分離
這可能與isinstance()
或type()
狂歡 - 我只是想知道這個任務是否有更好的設計。
我有一個解析數據到由許多不同的類組成的分層數據結構。現在,我想爲這些數據生成報告。我想支持多種輸出格式,所以我想將輸出後端與數據結構分開。Pythonic輸出後端分離
這可能與isinstance()
或type()
狂歡 - 我只是想知道這個任務是否有更好的設計。
就拿出兩種:
感謝鴨打字,不需要類型切換(或接口)。只需在給定的對象上調用所需的方法即可。
每一個簡單的例子。首先,可以從一個數據結構,拉動基礎上的字典,或從一個基於文件的樹,而不必知道有關數據來自哪裏任何一個後端:
class Reporter(object):
def report(self, data):
for key, value in data.walk():
print('{}: {}'.format(key, value))
class Data1(object):
def __init__(self):
self.d = {}
def walk(self):
return d.items()
class Data2(object):
def __init__(self, path):
self.path = path
def walk(self):
for dir, files, dirs in os.walk(self.path):
for file in files:
key = os.path.join(dir, file)
with open(key) as f:
value = f.read()
yield key, value
而現在,這裏有一個數據結構可以推送到任何後端(此時使用普通函數而不是類,僅用於多種):
class Data(object):
def report(self, renderer):
for key, value in self.tree.depthfirst():
renderer(key, value)
def renderer1(key, value):
print('{}: {}'.format(key, value))
def renderer2(key, value):
requests.post(url_template.format(key), data=value)