2016-04-22 7 views
4

ファイルの一部(wsgi app_iter)を生成するPythonジェネレータがあり、それを古典的なreadreadlinesのメソッドを持つことが予想されるインターフェイスに渡す必要がありますそれは別のRequestwsgi.inputとして)。バッファにファイルジェネレータをラップします

ジェネレータのコンテンツ全体がメモリに反映されないようにすることは可能ですか?考え方は、readreadline(例えば、BytesIOまたはStringIOなど)のものにジェネレータをラップして、それを怠惰な方法で実行することです。

答えて

2

確かに可能です。ここではあなたのアイデアを与えるために、コードの悲惨-非効率的な部分があります:

class ReadWrapper: 
    def __init__(self, app_iter): 
     self.iterator = iter(app_iter) 
     self.buffer = '' 
    def readline(self): 
     while '\n' not in self.buffer: 
      try: 
       self.buffer += next(self.iterator) 
      except StopIteration: 
       result = self.buffer 
       self.buffer = '' 
       return result 
     idx = self.buffer.find('\n') 
     result = self.buffer[:idx+1] 
     self.buffer = self.buffer[idx+1:] 
     return result 

read()ではなく\n探しのことを除いて同様であろう、あなたは指定されたバイト数(またはイテレータの終わりを探していますサイズが指定されていない場合)。

上記のコードの悲惨な非効率性は、self.bufferを処理する方法にあります。すべてのステップで\nのすべてを検索したり、潜在的に大きなコピーをたくさん作成したりすることは本当にありません。

+0

私は、標準ライブラリまたは少なくともPYPIに既に何かがあると思っていました。ライブラリに入れるのは良いことです –

関連する問題