Nick Coghlan <[email protected]> added the comment:
Regarding super().__init__(): I added ExitStack to contextlib2 first, so I was
thinking in the Py2/3 compatible subset when I wrote the original docs. We can
freely change that for the standard library recipes.
Regarding the "how to create a copy" question, while I don't especially like
the notion of adding a dedicated semi-public copy method, I think you're right
that it may be the best option:
1. Full pickle/copy module support doesn't make sense, since exit stacks are
inherently stateful - you can't save them to use later, since you'd need to
repeat the setup steps as well, but we don't keep track of what the setup steps
actually *were*.
2. `stack.pop_all()` was designed such that if you clone the stack, you ensure
that the original stack *won't* call the cleanup callbacks any more. If we were
to add a fully public `stack.copy()` method (or `copy.copy(stack)` support via
`stack.__copy__()`), then we'd lose that deliberate nudge, and put folks more
at risk of "double-free" style bugs, where they run the cleanup functions
multiple times.
3. A for-subclasses-only "self._clone()" API could work as follows:
def _clone(self, new_instance=None):
if new_instance is None:
new_instance = type(self)()
# Clone state here
return new_instance
Then subclasses could override *just* the instance creation part by doing:
def _clone(self):
return super()._clone(self._make_instance())
While also being free to add their own additional state copying code if needed.
----------
_______________________________________
Python tracker <[email protected]>
<https://bugs.python.org/issue32145>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com