我有一个生成器,通过过滤器返回来自多个文件的行。它看起来像这样:
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
?
答案 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
?
是的,但是当这个返回应该发生时没有指定:在几毫秒,几秒甚至更长的时间内。
如果你有一个阻塞迭代器,你可以在它周围定义一些包装器,以便它在不同的线程内运行,填充列表或其他东西,并且原始线程获得一个接口来确定是否有数据,如果当前有没有数据或源是否耗尽。
如果需要,我可以更详细地说明这一点。