# Create a class that implements a context manager as described in 3.3.9. # The context manager should keep track of an array of banana emojis. # The class should be able to be used with with: so it adds a banana to the list, and upon exit, removes a banana from the list. # class BananaManager: # def __init__(self, bananas): # self.bananas = bananas # def __enter__(self): # self.bananas.append("🍌") # return self.bananas # def __exit__(self, exc_type, exc_value, traceback): # self.bananas.pop() # # Usage of the banana manager # banana_list = ["🍌", "🍌"] # print("Before with statement:", banana_list) # with BananaManager(banana_list) as adding_bananas: # print("Inside with statement:", adding_bananas) # print("After with statement:", banana_list) # Questions: can you use a with block inside of another with block? (You might have to get creative for this to work.). # If you can make that work, how many bananas are in the list? # class BananaManager: # def __init__(self, bananas): # self.bananas = bananas # def __enter__(self): # self.bananas.append("🍌") # return self.bananas # def __exit__(self, exc_type, exc_value, traceback): # self.bananas.pop() # # Usage of the banana manager # banana_list = ["🍌", "🍌"] # print("Before with statement:", banana_list) # with BananaManager(banana_list) as adding_bananas: # print("Inside first with statement:", adding_bananas) # with BananaManager(adding_bananas) as inside_bananas: # print("Inside second with statement:", inside_bananas) # print("After with statement:", banana_list) # Another question: can you structure the program so that you can get the class to have more than 0 bananas *outside* of a with block? class BananaManager: def __init__(self, bananas): self.bananas = bananas def __enter__(self): self.bananas.append("🍌") return self.bananas def __exit__(self, exc_type, exc_value, traceback): self.bananas.pop() def outside_banana(self): self.bananas.append("🍌") # Usage of the banana manager banana_list = ["🍌", "🍌"] print("Before with statement:", banana_list) bananamanager = BananaManager(banana_list) bananamanager.outside_banana() # Add a banana outside of a with block print("Outside adding a banana:", banana_list) with BananaManager(banana_list) as adding_bananas: print("Inside first with statement:", adding_bananas) with BananaManager(adding_bananas) as inside_bananas: print("Inside second with statement:", inside_bananas) print("After with statement:", banana_list)