2

文字列を 1 行ずつ解析し、各解析結果のジェネレーターを提供したいと考えています。これらの結果を反復処理するコードは、必要な情報が見つかった場合、シーケンス全体を反復処理しないことを選択できます。

import StringIO

def foo(string):
  sstream = StringIO.StringIO(string)
  for line in sstream:
    res = doSomethingWith(line)
    yield res
  sstream.close()

for bar in foo(mystring):
  if condition(bar):
     break

になると、これはsstream開いたままcondition(bar)になると思いTrueます。sstream反復が終了したときに が閉じられることを保証する最善の方法は何foo()ですか? ジェネレーターをクラス定義でラップして実装する必要があります__del__か? または、ここでガベージコレクションに頼ることができますか? foo()色々な弦を呼ぶ予定です。

4

2 に答える 2

1

編集:以下の壊れたナンセンスを気にしないでください。私の知る限り、yield がある for ループでブレークを実行する必要があります。

このようなものはうまくいくでしょうか?私は簡単に何かを見落としている可能性があります。

import StringIO

# perform the break on the inner forloop first, to ensure sstream gets closed
break_ = false
def foo(string, break_):
  sstream = StringIO.StringIO(string)
  for line in sstream:
    res = doSomethingWith(line)
    if not break_: yield res
    else: break
  sstream.close()

for bar in foo(mystring, break_):
  if break_:
      break
  elif condition(bar):
     break_ = True
于 2013-06-18T08:36:39.140 に答える