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
内の次の行を. freenode の IRC で尋ねた内容とは関係のない小さな質問がありました。私は望んでいた助けを得ましたが、代わりに使用する提案も与えられ、結果のリストでインデックスを使用しました。(ペアワイズ ラインにinを使用できるとも言われましたが、後でそのアプローチを調査します。)elif
next(f)
f.readlines()
groupby()
itertools
という質問ですが、なぜその方がいいのか気になったのですが、電車の中でネットが不安定で聞けなかったのでこちらで質問させていただきます。readlines()
その場で読み取られるときにすべての行を解析するのではなく、すべてを読み取る方が良いのはなぜですか?
私の気持ちは反対なので、本当に疑問に思っています。すべてが一度に完了するように、一度に1行ずつ解析する方がきれいだと思います。私は通常、Python の配列でインデックスを使用することを避け、イテレータとジェネレータを使用することを好みます。主観的な意見ですので、その人の考えていることを推測して回答することは不可能かもしれませんが、一般的な推奨事項があれば教えていただければ幸いです。