I used the order I did because it's idiomatic to return the value the user needs followed by the value the user wants.
On Tue, 13 Jul 2021, 20:24 Serhiy Storchaka, <storch...@gmail.com> wrote: > 13.07.21 18:59, Thomas Grainger пише: > > given that it's hard to implement this correctly I think there should be > a builtins.enter and builtins.aenter for use like this: > > > > > > ``` > > @dataclasses.dataclass > > class WrapCmgr: > > _cmgr: ContextManager[T] > > > > def __enter__(self) -> Wrapped[T]: > > exit, value = enter(self._cmgr) > > self.__exit = exit > > return wrap(value) > > > > def __exit__(self, \, t: Type[BaseException] | None, v: > BaseException, tb: types.TracebackType) -> bool: > > return self.__exit(t, v, tb) > > ``` > > I considered similar idea when worked on issue12022 and issue44471. The > only difference is that I added the helper in the operator module, and > my operator.enter() returned the value and the callback in the different > order. > > def enter(cm): > # We look up the special methods on the type to match the with > # statement. > cls = type(cm) > try: > enter = cls.__enter__ > exit = cls.__exit__ > except AttributeError: > raise TypeError(f"'{cls.__module__}.{cls.__qualname__}' object > does " > f"not support the context manager protocol") > from None > callback = _MethodType(exit, cm) > return enter(cm), callback > > I still investigate possible consequences and alternatives. > > Since we need to save the callback as an object attribute in any case, > one of alternatives is using ExitStack instead of introducing new API. > It is more heavyweight, but if implemented in C the difference can be > reduced. > > Other alternative is to expose _PyObject_LookupSpecial() at Python > level. It would be useful not only for __enter__ and __exit__, but for > other special methods. > > _______________________________________________ > 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/FAQAGFAFVVAKPAU3U6AMFTKUMZCLK2GY/ > Code of Conduct: http://python.org/psf/codeofconduct/ >
_______________________________________________ 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/JT3NJWCSDXGQH32FGT5SDP7N7EQEOA2O/ Code of Conduct: http://python.org/psf/codeofconduct/