I happened to notice that there might be a small point to adjust. The updated equivalent code manager.__enter__ could look up __enter__ in the instance attributes, but the with-statement does not.
import sys
class CM:
def __init__(self):
def __enter__():
pass
def __exit__(*exc_details):
pass
self.__enter__ = __enter__
self.__exit__ = __exit__
# Not works: TypeError: 'CM' object does not support the context manager protocol (missed __exit__ method)
with CM():
pass
# Works
manager = CM()
enter = manager.__enter__
exit_ = manager.__exit__
value = enter()
hit_except = False
try:
TARGET = value
except:
hit_except = True
if not exit(*sys.exc_info()):
raise
finally:
if not hit_except:
exit_(None, None, None)
Originally posted by @tanloong in python/cpython#144472 (comment)
Originally posted by @quanghuynh10111-png in python/cpython#144671