1

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

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

4

2 回答 2

5

fileinput如果列表为空,则默认为 stdin,因此它只是在等待您输入内容。

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

for path in self.get_files():
    with open(path) as fp:
      for line in fp:
         etc
于 2013-10-21T10:36:53.907 回答
2

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

不应该.next()总是返回一些东西,或者提出一个StopIteration

是的,但是没有指定应该在什么时候返回:在几毫秒、几秒甚至更长的时间内。

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

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

于 2013-10-21T11:45:18.183 回答