On Mon, 18 Nov 2019 at 14:07, Soni L. <fakedme...@gmail.com> wrote: > On 2019-11-18 11:32 a.m., Oscar Benjamin wrote: > > On Mon, 18 Nov 2019 at 13:12, Soni L. <fakedme...@gmail.com> wrote: > > > > > > On 2019-11-18 9:10 a.m., Oscar Benjamin wrote: > > > > > > > > with nested(open(filename) for filename in filenames) as files: > > > > ... > > > > > > > > Here nested could take advantage of the delayed evaluation in the > > > > generator expression to invoke the __enter__ methods and call __exit__ > > > > on the opened files if any of the open calls fails. This would also > > > > leave a "trap" though since using a list comprehension would suffer > > > > the same problem as if nested took *args: > > > > > > > > with nested([open(filename) for filename in filenames]) as files: > > > > ... > > > > > > If generator expressions (aka "(open(filename) for filename in > > > filenames)") had __enter__ and __exit__ that deferred to inner __enter__ > > > and __exit__, this "trap" wouldn't exist: > > > [snip] > > > > Since generators already have a close method the obvious thing for > > generator.__exit__ to do (if it existed) would be to call that. That > > would make it possible to use patterns like: > > [snip] > > Sure. We can always split generator methods and generator expressions. > After all, you can't use "with" in a generator expression, so it makes > no sense to call close there.
I don't think that splitting these is a good idea. Currently both of these return the same type of object: a generator. The generator expression gen = (x for x in y if z) is explicitly defined as being equivalent to def _tmp(): for x in y: if z: yield x gen = _tmp() The resulting objects are the same and have the same methods etc. -- Oscar _______________________________________________ Python-ideas mailing list -- python-ideas@python.org To unsubscribe send an email to python-ideas-le...@python.org https://mail.python.org/mailman3/lists/python-ideas.python.org/ Message archived at https://mail.python.org/archives/list/python-ideas@python.org/message/CNQILDQPXWAHHJRWKASFQES6BZNG2VBU/ Code of Conduct: http://python.org/psf/codeofconduct/