2013-12-17 6 views
5

Ich habe ein Stück Code (ein xls-Parser), der einige Validierung für die Felder und gibt mit yield einen Generator zurück, der jede Zeile der xls enthält.Verwenden von Ertrag und Rückgabe einer Liste von Fehler

Jetzt muss ich Validierungsfehler in einer Liste sammeln und sie verwenden, wenn der Generator erschöpft ist.

Dies ist ein Stück Code, der den Parser und eine schlecht entworfene Lösung darstellt.

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 

Gibt es einen mehr pythonischen Weg, dies zu tun? Ich bin kein großer Fan von globalen Variablen.

Ich würde gerne den Code zu halten, wie es so viel wie möglich ist, aber wenn es keine andere Möglichkeit gibt, werde ich die Funktion eines klassischen

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 

Antwort

5

Eine Generatorfunktion kann nicht out-of-Band-Daten, wie dies zurück.

würde ich eine Klasse verwenden stattdessen als eine Instanz, die Sie etwas gibt solche zusätzlichen Zustand zu halten:

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 

und iterieren das Objekt:

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

errors = parser.error_list 
+0

@Eric: Vielen Dank für die Korrektur; unsere Bearbeitungen kollidierten, ich nahm den Fix manuell auf. –

+0

Es gibt einen Tippfehler. Es hätte "XLSParser" statt "XMLParser" sein sollen. – thefourtheye

+0

es funktioniert wie ein Charme, danke! –

3

Sie eine Ausnahme umwandeln könnte verwenden:

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 
Verwandte Themen