2013-12-17 35 views
5

Mam fragment kodu (analizator składni XLS), który wykonuje pewne sprawdzanie poprawności na polach i zwraca z wydajnym generatorem, który zawiera każdy wiersz z xls.Użycie Pobierz i zwróć listę błędów

Teraz muszę zebrać błędy sprawdzania poprawności na liście i używać ich, gdy generator jest wyczerpany.

To jest fragment kodu, który przedstawia analizator składni i kiepsko zaprojektowane rozwiązanie.

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 

jest bardziej pythonic sposób to zrobić? Nie jestem wielkim fanem zmiennych globalnych.

ja bym chciała zachować kod jak to jest jak to możliwe, ale jeśli nie ma innego sposobu, będę przekształcić funkcję klasycznego

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 

Odpowiedz

5

funkcja generatora nie może powrócić z pasmem danych, takich jak to.

bym użyć klasę zamiast, jak to przykład daje coś trzymać takiego dodatkowego Stan:

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 

i iteracyjne nad tym obiekcie:

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

errors = parser.error_list 
+0

@Eric: Dzięki za korekta; nasze modyfikacje zostały zderzone, wprowadziłem poprawkę ręcznie. –

+0

Istnieje literówka. Powinien to być 'XLSParser' zamiast' XMLParser'. – thefourtheye

+0

działa jak urok, dzięki! –

3

Można użyć wyjątek:

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