Niedawno napisałem metodę, która zwróciła sekwencję otwartych plików; Innymi słowy, coś takiego:Czy dobrą praktyką jest poddawanie się z poziomu menedżera kontekstu?
# 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)
Składniowo, mam nie spodziewać się zamknąć powstałych obiektów, jeśli zrobię coś takiego:
for f in _iterdir('/', 'usr'):
make_unicorns_from(f)
# ! f.close()
W rezultacie postanowiłem owinąć _iterdir
w menedżera kontekstowego:
def iterdir(self, *path):
it = self._iterdir(*path)
while 1:
with it.next() as f:
yield f
To wydaje się działać poprawnie.
Co mnie interesuje, to czy jest to dobra praktyka. Czy napotkam jakiekolwiek problemy wynikające z tego wzorca (być może, jeśli zostaną zgłoszone wyjątki)?
Wygląda dobrze, zrobiłem szybką kontrolę z niestandardowym menedżerem kontekstu i '__exit__' został nazwany dobrze nawet, gdy wystąpił wyjątek. –