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

时间:2013-10-21 10:33:28

标签: python python-2.7

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

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()。这就是它挂起的地方,我无法理解为什么。我试图成为pythonic,而不是自己处理所有错误,但我想这是一个没有办法解决的问题。或者有吗?

不幸的是我现在无法在Linux上测试这个,但有人可以在Linux上尝试以下内容,并评论他们得到的内容吗?

import fileinput
s = fileinput.input([])
s.next()

我在Windows上使用Python 2.7.5(64位)。

总而言之,我真的很想知道:

这是Python中的错误,还是我做错了什么? 不应该.next()总是返回一些东西,或者提出一个StopIteration

2 个答案:

答案 0 :(得分:5)

如果列表为空,

fileinput默认为stdin,所以它只是在等你输入内容。

一个明显的解决方法是摆脱fileinput(无论如何都不是非常有用)并且要明确,正如python zen建议的那样:

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

答案 1 :(得分:2)

正如其他人已经回答的那样,我尝试回答一个特定的子项目:

  

.next()不应该总是返回某些内容,或者提出StopIteration

是的,但是当这个返回应该发生时没有指定:在几毫秒,几秒甚至更长的时间内。

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

如果需要,我可以更详细地说明这一点。