Nick Coghlan <[email protected]> added the comment:
That's certainly similar to the problems with contextlib.nested, but I don't
think it's as inherently flawed as nested was. What I'd suggest we change the
existing example to is this:
from functools import partial
from os import fspath
def process_file(file_or_path):
try:
as_fspath = os.fspath(file_or_path)
except TypeError:
# If it's a file, caller is responsible for closing it
make_cm = partial(nullcontext, file_or_path)
else:
# If it's a path, open file when the context is entered
make_cm = partial(open, as_fspath)
with make_cm() as file:
# Perform processing on the file
Optionally, we could also present a cleaner example where a pre-created context
manager is passed in and we're just coping with the fact it may be None:
def update_resource(resource, updates, resource_lock=None):
if resource_lock is None:
resource_lock = nullcontext()
with resource_lock:
resource.apply_updates(updates)
(I'll also note that ExitStack is *far* from being immune to the Ctrl-C
problem, as it's implemented in Python itself, which allows its __exit__ method
to be interrupted, as well as for interrupt to occur between a resource being
created or acquired, and it being registered with the stack)
----------
_______________________________________
Python tracker <[email protected]>
<https://bugs.python.org/issue34067>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com