我有一个python生成器,产生一个文件的一部分(一个wsgi app_iter
),我需要将它传递给一个接口,期望它有经典的read
和readlines
方法(我想把它传递给另一个wsgi.input
的Request
)。
有可能以不将整个生成器内容实现到内存的方式来实现吗?我的想法是将生成器包装在具有read
和readline
(例如BytesIO
或StringIO
)的东西中并以懒惰的方式进行。
这当然是可能的。这是一段非常低效的代码,可以为您提供这样的想法:
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
的全部内容,或者做很多可能很大的副本。