2013-10-06 63 views
-2

我有一個解析數據到由許多不同的類組成的分層數據結構。現在,我想爲這些數據生成報告。我想支持多種輸出格式,所以我想將輸出後端與數據結構分開。Pythonic輸出後端分離

這可能與isinstance()type()狂歡 - 我只是想知道這個任務是否有更好的設計。

回答

1

就拿出兩種:

  • ......「拉」的API,所有的數據結構的實現,任何後端可以使用。
  • ...一個「推」API,所有後端實現任何數據結構都可以使用的API。

感謝鴨打字,不需要類型切換(或接口)。只需在給定的對象上調用所需的方法即可。

每一個簡單的例子。首先,可以從一個數據結構,拉動基礎上的字典,或從一個基於文件的樹,而不必知道有關數據來自哪裏任何一個後端:

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)