为什么我的生成器挂起而不是抛出异常?

2024-04-19 05:19:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个生成器,它通过过滤器从许多文件中返回行。看起来像这样:

def line_generator(self):
    # Find the relevant files
    files = self.get_files()

    # Read lines
    input_object = fileinput.input(files)
    for line in input_object:

        # Apply filter and yield if it is not *None*
        filtered = self.__line_filter(input_object.filename(), line)
        if filtered is not None:
            yield filtered

    input_object.close()

方法self.get_files()返回文件路径列表或空列表。 我试图做s = fileinput.input([]),然后调用s.next()。这就是它挂的地方,我不明白为什么。我试着变成Python,而不是自己处理所有的错误,但我想这是一个没有办法的地方。还是有?在

不幸的是,我现在没有办法在Linux上测试这一点,但是有人可以在Linux上尝试下面的操作,并评论一下他们得到了什么?在

^{pr2}$

我使用的是带有python2.7.5(64位)的Windows。在

总之,我很想知道:

这是Python中的bug,还是我做错了什么? next()不应该总是返回某个值,或者引发一个StopIteration?在


Tags: 文件selfnoneinputgetifobjectis
2条回答

正如其他人已经回答的那样,我试图回答一个具体的分项:

Shouldn't .next() always return something, or raise a StopIteration?

是的,但不指定何时应该发生此返回:在几毫秒、几秒钟甚至更长的时间内。在

如果您有一个阻塞迭代器,您可以在它周围定义一些包装器,以便它在不同的线程中运行,填充一个列表或其他东西,并且原始线程将获得一个接口来确定是否存在数据、当前是否没有数据或源是否已用尽。在

如果需要的话,我可以详细说明。在

如果列表为空,^{}将默认为stdin,因此它将等待您键入内容。在

一个明显的解决方法是去掉fileinput(反正不是很有用)并且显式地,正如python zen建议的那样:

for path in self.get_files():
    with open(path) as fp:
      for line in fp:
         etc

相关问题 更多 >