Maybe this is a stupid (and indeed not very practical) question but I'm asking it because I can't wrap my head around it.
While researching if a return statement inside a call to a context manager would prevent __exit__ from being called (no it doesn't), I found that it seems common to make an analogy between __exit__ and finally in a try/finally block (for example here: https://stackoverflow.com/a/9885287/3471881) because:
def test():
    try:
        return True
    finally:
        print("Good bye")
Would execute the same as:
class MyContextManager:
    def __enter__(self):
        return self
    def __exit__(self, *args):
        print('Good bye')
def test():
    with MyContextManager():
        return True
This really helped me understand how cm:s work but after playing around a bit I realised that this analogy wont work if we are returning something rather than printing.
def test():
    try:
        return True
    finally:
        return False
test()    
--> False
While __exit__ seemingly wont return at all:
class MyContextManager:
    def __enter__(self):
        return self
    def __exit__(self, *args):
        return False
def test():
    with MyContextManager():
        return True
test()
--> True
This lead me to think that perhaps you can't actually return anything inside __exit__, but you can:
class MyContextManager:
    def __enter__(self):
        return self
    def __exit__(self, *args):
        return self.last_goodbye()
    def last_goodbye(self):
        print('Good bye')
def test():
    with MyContextManager():
        return True
test()
--> Good bye
--> True
Note that it doesn't matter if we don't return anything inside the test() function.
This leads me to my question:
- Is it impossible to return a value from inside __exit__and if so, why?
 
     
    