我最近写了一个返回一系列打开文件的方法;换句话说,是这样的:
# 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
这似乎工作正常。
我感兴趣的是这样做是否是好的做法。按照这种模式我会遇到任何问题(也许如果抛出异常)?