【发布时间】:2017-12-07 07:26:36
【问题描述】:
问题:
程序从文件末尾开始从无限流中读取行。
#解决方案:
import time
def tail(theFile):
theFile.seek(0,2) # Go to the end of the file
while True:
line = theFile.readline()
if not line:
time.sleep(10) # Sleep briefly for 10sec
continue
yield line
if __name__ == '__main__':
fd = open('./file', 'r+')
for line in tail(fd):
print(line)
readline() 是非阻塞读取,每行都进行 if 检查。
问题:
在写入文件的进程有close()之后,我的程序运行无限等待是没有意义的
1) 该代码的 EAFP 方法是什么,以避免if?
2) 生成器函数可以在file 关闭时返回吗?
【问题讨论】:
-
“如果不检查,该代码的 EAFP 方法是什么?” - 真的没什么。您使用 if 语句的原因不是为了防止 Python 引发错误,而是为了验证
line实际上有有用的内容要返回。 Python 不在乎这是否属实。无论如何,它都会产生line而不会引发错误。 -
@ChristianDean EAFP 不鼓励在引用 (
yield line) 名称之前对名称进行条件检查。 -
我明白这一点。但是没有什么可以为请求宽恕的。从 Python 的角度来看,您没有做错任何事情。同样,Python 不关心
line是否为空。不管怎样,它都会执行yield line。在这里使用try/except块实际上是没有用的。坚持使用if。 -
@ChristianDean 可以在循环中向
continue表示宽恕。宽恕部分不需要引发异常。我不应该在except块中写continue吗? -
好的。但这仍然不能解决问题。 为请求宽恕也不例外。因为
line是空的,所以不会在您的函数中引发错误。因此,请求原谅是没有意义的。
标签: python python-3.x stream generator pipeline