2013-12-17 21 views
5

我有一段代碼(一個xls解析器),它對字段執行一些驗證,並返回一個包含xls每行的生成器。使用良率並返回錯誤列表

現在,我必須收集列表中的驗證錯誤,並在發生器耗盡時使用它們。

這是代表解析器和設計不佳的解決方案的一段代碼。

error_list = [] 

def gen(limit): #xls parser 
    for x in range(limit): 
     if x%2: #fake error contition 
      error_list.append(x) 
     else: 
      yield(x*x) #return 

有沒有更pythonic的方式來做到這一點?我不是全球變數的忠實粉絲。

我很想保持代碼,因爲它是儘可能的,但如果沒有其他辦法,我要的功能轉換爲經典

def gen(limit): #xls parser 
    error_list = [] 
    results = [] 
    for x in range(limit): 
     if x%2: #fake error contition 
      error_list.append(x) 
     else: 
      results.append(x*x) 
    return results, error_list 

回答

5

發電機功能不能返回出來的帶外數據是這樣的。

我會使用一個類,而不是作爲一個實例給你的東西要堅持這樣的額外的狀態:

class XLSParser(object): 
    def __init__(self, limit): 
     self.error_list = [] 
     self.limit = limit 

    def __iter__(self): 
     for x in range(self.limit): 
      if x%2: #fake error condition 
       self.error_list.append(x) 
      else: 
       yield(x*x) #return 

,並遍歷該對象:

parser = XLSParser(limit) 
for result in parser: 
    # do something 

errors = parser.error_list 
+0

@Eric:感謝更正;我們的編輯相互碰撞,我手動合併了修復。 –

+0

有一個錯字。它應該是'XLSParser'而不是'XMLParser'。 – thefourtheye

+0

它就像一個魅力,謝謝! –

3

你可以使用一個例外:

class XlsErrorList(Exception): pass 

def gen(limit): 
    """xls parser""" 
    error_list = [] 
    for x in range(limit): 
     if x%2: # fake error contition 
      error_list.append(x) 
     else: 
      yield x*x 

    if error_list: 
     raise XlsErrorList(error_list) 
try: 
    for x in gen(10): 
     print x 

except XlsErrorList as e: 
    print e.args