Added example answers for chapters 13 and 14 to fix #1

This commit is contained in:
Rick van Hattem
2022-08-31 20:49:02 +02:00
parent 1c106d776c
commit 82cf71ed1c
20 changed files with 690 additions and 0 deletions
+76
View File
@@ -0,0 +1,76 @@
# Try to create a `asyncio` base class that automatically
# registers all instances for easy closing/destructuring when you
# are done
import abc
import asyncio
class AsyncBase(abc.ABC):
_instances = []
def __init__(self):
self._instances.append(self)
async def close(self):
raise NotImplementedError
class AsyncManager(AsyncBase):
# Use a separate class for the managing of the instances so
# we don't pollute the namespace of the base class
@classmethod
async def close(cls):
# Make sure to clear the list of instances while closing
while cls._instances:
await cls._instances.pop().close()
# Support `async with` syntax as well
async def __aenter__(self):
return self
async def __aexit__(self, exc_type, exc, tb):
await self.close()
class A(AsyncBase):
def __init__(self):
super().__init__()
print('A.__init__')
async def close(self):
print('A.close')
class B(AsyncBase):
def __init__(self):
super().__init__()
print('B.__init__')
async def close(self):
print('B.close')
async def main():
print('Using close method directly')
A()
B()
await AsyncManager.close()
print()
async def main_with():
print('Using async with')
async with AsyncManager():
A()
B()
print()
if __name__ == '__main__':
asyncio.run(main())
asyncio.run(main_with())