一次只产生一行的惰性文件读取器



我想建立一个可以这样使用的类:

d = Data(file_name)
line = next(d)
# or
for line in d:
print(line)

我有这样一个类:

@dataclass
class Data:
file_name: str
data: IO = field(default=None)
def __post_init__(self):
self._data = open(self.file_name)
def __enter__(self):
return self
def read_lines(self):
for line in self._data:
yield line
def __next__(self):
for line in self._data:
yield line
def __exit__(self, exc_type, exc_val, exc_tb):
if self.data:
self.data.close()

如果我使用这段代码,那么它工作正常:

with self._data as data:
for line in data.read_lines():
print(line)

但是当尝试使用next时,我打印生成器对象而不是文件行。

with self._data as data:
while line := next(data):
print(line)

如何成功使用next方法?

文件本身是一个迭代器。你的__next__函数唯一要做的就是调用next

def __next__(self):
return next(self._data)

最新更新