Nick Coghlan <ncogh...@gmail.com> added the comment: I'm not clear on what you mean about allowing arbitrary names for the instance creation function - at that point we're back to subclasses not being able to use the default `pop_all()` implementation at all, and needing to duplicate the state transfer logic in the subclass (which we don't provide a public API to do, since the `_exit_callbacks` queue is deliberately private).
However, I'm thinking we could potentially change `pop_all` *itself* to accept a target object: def pop_all(self, *, target=None): """Preserve the context stack by transferring it to a new instance If a *target* stack is given, it must be either an `ExitStack` instance, or else provide a callback registration method akin to `ExitStack.callback`. """ if target is None: target = type(self)() exit_callbacks = self._exit_callbacks self._exit_callbacks = deque() if isinstance(target, ExitStack): target._exit_callbacks = exit_callbacks else: for cb in exit_callbacks: target.callback(cb) return target The recipe fix would then be to make `Callback.cancel()` look like: def cancel(self): # We deliberately *don't* clean up the cancelled callback self.pop_all(target=ExitStack()) (Tangent: https://bugs.python.org/issue32445 suggests adding a small optimisation to `ExitStack.callback` to skip adding the wrapper when `args` and `kwds` are both empty) ---------- _______________________________________ Python tracker <rep...@bugs.python.org> <https://bugs.python.org/issue32145> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com