我有一个python生成器,它生成一个文件的一部分(wsgiapp_iter),我需要将它传递给一个接口,该接口希望它具有经典的readreadlines方法(我想将它作为另一个wsgi.inputRequest传递)。
是否可以不将整个生成器内容具体化到内存中?其思想是将生成器包装成具有readreadline(例如BytesIOStringIO)的内容,并以一种懒惰的方式来完成它。

最佳答案

当然有可能。下面是一段非常低效的代码,可以告诉您这个想法:

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,或者执行这么多潜在的大拷贝。

关于python - 将生成器包装到缓冲区中?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36798936/

10-12 21:49
查看更多