2013-12-17 7 views
5

フィールド上で検証を行い、xlsのすべての行を含むジェネレータを生成するコード(xlsパーサー)があります。Yieldを使用してエラーのリストを返します

ここで、検証エラーをリストで収集し、ジェネレータが使い果たされたときに使用する必要があります。

これはパーサと貧弱な設計ソリューションを表すコードです。

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 

これを行うにはもっとpythonicな方法がありますか?私はグローバル変数の大ファンではない。

それは可能な限りですが、他に方法がない場合、私はあなたが例外使用することができます古典的な

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 

答えて

5

ジェネレータ関数は、このような帯域外のデータを返すことができません。

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 

と、そのオブジェクトを反復処理:

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

errors = parser.error_list 
+0

@Eric:インスタンスは、このような余分な状態に固執するあなたに何かを与えるよう

私は、代わりにクラスを使用したいためのおかげで補正;私たちの編集が衝突した、私は手動で修正を組み込んだ。 –

+0

タイプミスがあります。 'XMLParser'ではなく' XLSParser'だったはずです。 – thefourtheye

+0

それは魅力のように動作します、ありがとう! –

3

に関数を変換しますと、私はコードを維持してみたい:

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 
関連する問題