2013-12-17 13 views
5

Ho un pezzo di codice (un parser xls) che esegue qualche convalida sui campi e restituisce con rendimento un generatore che contiene ogni riga di xls.Utilizzo di Yield e restituire un elenco di errori

Ora devo raccogliere gli errori di convalida in un elenco e usarli quando il generatore è esaurito.

Questo è un pezzo di codice che rappresenta il parser e una soluzione progettata scadente.

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 

c'è un modo più pioneristico per farlo? non sono un grande fan delle variabili globali.

mi piacerebbe mantenere il codice in quanto è il più possibile, ma se non c'è altro modo i convertiremo la funzione di un classico

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 

risposta

5

Una funzione generatore non può restituire out-of-band dati come questo.

userei un classe invece, come un esempio ti dà qualcosa di attaccare tale stato in più:

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 

e iterare quell'oggetto:

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

errors = parser.error_list 
+0

@Eric: grazie per la la correzione; le nostre modifiche si sono scontrate, ho incorporato la correzione manualmente. –

+0

C'è un errore di battitura. Dovrebbe essere "XLSParser" invece di "XMLParser". – thefourtheye

+0

funziona come un fascino, grazie! –

3

Si potrebbe utilizzare un'eccezione:

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