我正在制作一个简单的测试函数,它通过从文件中读取要评估的表达式和预期结果来断言我正在开发的解释器的输出是正确的,就像 python 的 doctest。这是用于方案,因此输入文件的示例是
> 42
42
> (+ 1 2 3)
6
我对可以解析此类文件的函数的第一次尝试如下所示,它似乎按预期工作:
def run_test(filename):
interp = Interpreter()
response_next = False
num_tests = 0
with open(filename) as f:
for line in f:
if response_next:
assert response == line.rstrip('\n')
response_next = False
elif line.startswith('> '):
num_tests += 1
response = interp.eval(line[2:])
response = str(response) if response else ''
response_next = True
print "{:20} Ran {} tests successfully".format(os.path.basename(filename),
num_tests)
我想通过删除response_next
标志来稍微改进它,因为我不喜欢这样的标志,而是在elif
块中的下一行读取next(f)
. 关于我在 freenode 的 IRC 中提出的问题,我有一个无关紧要的小问题。我得到了我想要的帮助,但我也得到了使用的建议f.readlines()
,然后在结果列表上使用索引。(我还被告知我可以将groupby()
initertools
用于成对线,但我稍后会研究这种方法。)
现在到这个问题,我很好奇为什么这种方法会更好,但是我的互联网连接在火车上是不稳定的,我无法问,所以我会在这里问它。readlines()
为什么阅读所有内容而不是在动态阅读时解析每一行会更好?
我真的很想知道,因为我的感觉是相反的,我认为一次解析一行似乎更干净,这样一切都可以一口气完成。我通常避免在 Python 的数组中使用索引,而是更喜欢使用迭代器和生成器。如果这是一个主观意见,也许不可能回答和猜测这个人在想什么,但如果有一些一般性的建议,我很乐意听到。