2013-12-17 18 views
5

Alanlarda bazı doğrulama yapan ve her xls satırını içeren bir üretkenlik veren bir kod parçacığım (xls çözümleyicisi) var.Verim Kullanma ve hata listesini döndürme

Şimdi, bir listede doğrulama hatalarını toplamak ve jeneratör tükendiğinde bunları kullanmak zorundayım.

Bu, ayrıştırıcıyı ve kötü tasarlanmış bir çözümü temsil eden bir kod parçasıdır.

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 

Bunu yapmanın daha peshonik bir yolu var mı? Küresel değişkenlerin büyük bir hayranı değilim.

mümkün olduğunca olduğunu ama başka yol varsa ben bir istisna kullanabilirsiniz klasik

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 

cevap

5

bir jeneratör işlevi aşağıdaki gibi üzerinden bant verileri döndüremez.

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 

ve o nesnenin üzerinde yineleme:

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

errors = parser.error_list 
+0

@Eric: bir örnek bu tür ekstra durumunu sopa bir şey verir gibi

Ben, bunun yerine bir sınıf kullanırsınız için teşekkürler düzeltme; düzenlemelerimiz çakıştı, düzeltmeyi manuel olarak ekledim. –

+0

Bir yazım hatası var. XMLParser' yerine "XLSParser" olmalıdır. – thefourtheye

+0

Bir çekicilik gibi çalışıyor, teşekkürler! –

3

fonksiyonu dönüştürürüz olarak ben kod tutmak isteriz:

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