私は最近、開いているファイルのシーケンスを返すメソッドを書きました。つまり、次のようなものです。
# this is very much simplified, of course
# the actual code returns file-like objects, not necessarily files
def _iterdir(self, *path):
dr = os.path.join(*path)
paths = imap(lambda fn: os.path.join(dr, fn), os.listdir(dr))
return imap(open, paths)
構文的には、次のようなことを行った場合、結果のオブジェクトを閉じる必要はないと思います。
for f in _iterdir('/', 'usr'):
make_unicorns_from(f)
# ! f.close()
その結果、_iterdir
コンテキスト マネージャーでラップすることにしました。
def iterdir(self, *path):
it = self._iterdir(*path)
while 1:
with it.next() as f:
yield f
これは正しく機能しているようです。
私が興味を持っているのは、これを行うことが良い習慣であるかどうかです。このパターンに従って問題が発生することはありますか (おそらく例外がスローされた場合)?