
currently lots of code manages contexts incorrectly by doing:
``` @dataclasses.dataclass class WrapCmgr: _cmgr: ContextManager[T]
def __enter__(self) -> Wrapped[T]: return wrap(_cmgr.__enter__())
def __exit__(self, , t: Type[BaseException] | None, v: BaseException, tb: types.TracebackType) -> bool: return _cmgr.__exit__(t, v, tb) ```
since https://bugs.python.org/issue44471 using `with WrapCmgr(cmgr()):` incorrectly raises an AttributeError rather than a TypeError
and https://www.python.org/dev/peps/pep-0343/ still includes this bug, raising an AttributeError
``` mgr = (EXPR) exit = type(mgr).__exit__ # Not calling it yet value = type(mgr).__enter__(mgr) ```
contextlib.ExitStack also had this bug https://bugs.python.org/issue12022
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) ```