On Oct 17, 2013, at 08:40 PM, Xavier Morel wrote: >I think there's already a significant split between context managers >which handle the lifecycle of a local resource (file, transaction) and >those which purport to locally alter global-ish state (cwd, >decimal.localcontext, logging.captureWarnings, redirect_stdout). > >And the latter worries me (much more than the very localized behavior of >suppress) because I don't see any way to implement them safely and >correctly when mixing it with coroutines in today's Python (some of them >aren't even thread-safe), all of that while I expect coroutines will see >significantly more use in the very near future with yield from and >tulip's promotion of coroutine-style async.
Although slightly orthogonal to my previous distinction, this is a great point. Anything affecting global state will have this problem of course. It's definitely something to keep thinking about. >> Just look at the implementation to see this shift in perspective. It >> doesn't use try/finally, it uses try/except. > >Transaction CMs will also use try/except: > > @contextmanager > def transaction(): > resource = open_tnx() > try: > yield resource > resource.commit() > except: > resource.rollback() > raise True. I'm sure lots of us have code almost exactly like this. ;) For me, it's closer to the original intent though because the bare-except combined with the re-raising of the exception feels kind of like a finally. In both exit paths, the resource is being released, it's just that you have to know which "release" operation to perform. Cheers, -Barry _______________________________________________ Python-Dev mailing list Python-Dev@python.org https://mail.python.org/mailman/listinfo/python-dev Unsubscribe: https://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com