将发电机包装到缓冲器中?

时间:2016-04-22 16:26:21

标签: python buffer generator wsgi bytesio

我有一个python生成器,它生成文件的一部分(wsgi app_iter),我需要将它传递给一个接口,该接口要求它具有经典的readreadlines方法(我希望将其作为另一个wsgi.input的{​​{1}}传递。

是否可以通过不将整个生成器内容实现到内存中的方式来实现?我的想法是将生成器包装在具有Requestread(例如readlineBytesIO)的内容中,并以懒惰的方式执行。

1 个答案:

答案 0 :(得分:3)

这当然是可能的。这是一段非常低效的代码,可以为您提供这个想法:

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,而是查找指定的字节数(如果没有指定大小,则查找迭代器的结尾)。< / p>

上述代码的低效率是它处理self.buffer的方式:你并不是真的想在每一步都搜索\n的整个事情,或者做很多事情可能很大的副本。