2013-12-17 18 views
5

Tôi có một đoạn mã (một trình phân tích cú pháp xls) thực hiện một số xác nhận trên các trường và trả về với năng suất một trình tạo chứa mọi hàng của xls.Sử dụng Lợi nhuận và trả về danh sách lỗi

Bây giờ, tôi phải thu thập các lỗi xác thực trong danh sách và sử dụng chúng khi máy phát bị cạn kiệt.

Đây là một đoạn mã đại diện cho trình phân tích cú pháp và giải pháp được thiết kế kém.

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ó cách nào khác để thực hiện điều này không? Tôi không phải là một fan hâm mộ lớn của các biến toàn cầu.

tôi rất muốn giữ các mã như nó là càng nhiều càng tốt nhưng nếu không có cách nào khác tôi sẽ chuyển đổi các chức năng để một cổ điển

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 

Trả lời

5

Một chức năng máy phát điện không thể trở về out-of-band dữ liệu như thế này.

Tôi muốn sử dụng một lớp thay vào đó, là một ví dụ mang đến cho bạn một cái gì đó để gắn bó thêm tình trạng như vậy:

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 

và lặp trên đối tượng đó:

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

errors = parser.error_list 
+0

@ Eric: cảm ơn sự điều chỉnh; chỉnh sửa của chúng tôi va chạm, tôi kết hợp sửa chữa theo cách thủ công. –

+0

Có lỗi đánh máy. Nó phải là 'XLSParser' thay vì' XMLParser'. – thefourtheye

+0

nó hoạt động như một sự quyến rũ, cảm ơn! –

3

Bạn có thể sử dụng một ngoại lệ:

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 
Các vấn đề liên quan