import asyncio
 
from collections import UserDict
from typing import Any
 
 
class AwaitDict(UserDict):
    def __init__(self, dict=None, /, **kwargs):
        self._await_task: dict[str, asyncio.Future] = {}
        super().__init__(dict=None, **kwargs)
 
    def __setitem__(self, key: str, item: Any):
        if future := self._await_task.get(key):
            if future.done():
                raise Exception('Expected value has not been received yet')
            future.set_result(item)
 
        super().__setitem__(key, item)
 
    def __getitem__(self, item: str) -> Any:
        if item in self._await_task:
            self._await_task.pop(item)
 
        return super().__getitem__(item)
 
    async def await_elem(self, key: str) -> Any:
        future = asyncio.Future()
        self._await_task[key] = future
        await future
        return future.result()
 
 
async def set_elem(aw: AwaitDict, key: str, value: Any):
    await asyncio.sleep(3)
    aw[key] = value
 
 
async def main():
    my_dict = AwaitDict()
    asyncio.create_task(
        set_elem(
            aw=my_dict,
            key='123',
            value=123
        )
    )
    data = await my_dict.await_elem('123')
    print(data)
    print(my_dict['123'])
 
asyncio.run(main())
 
				aW1wb3J0IGFzeW5jaW8KCmZyb20gY29sbGVjdGlvbnMgaW1wb3J0IFVzZXJEaWN0CmZyb20gdHlwaW5nIGltcG9ydCBBbnkKCgpjbGFzcyBBd2FpdERpY3QoVXNlckRpY3QpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGRpY3Q9Tm9uZSwgLywgKiprd2FyZ3MpOgogICAgICAgIHNlbGYuX2F3YWl0X3Rhc2s6IGRpY3Rbc3RyLCBhc3luY2lvLkZ1dHVyZV0gPSB7fQogICAgICAgIHN1cGVyKCkuX19pbml0X18oZGljdD1Ob25lLCAqKmt3YXJncykKCiAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwga2V5OiBzdHIsIGl0ZW06IEFueSk6CiAgICAgICAgaWYgZnV0dXJlIDo9IHNlbGYuX2F3YWl0X3Rhc2suZ2V0KGtleSk6CiAgICAgICAgICAgIGlmIGZ1dHVyZS5kb25lKCk6CiAgICAgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oJ0V4cGVjdGVkIHZhbHVlIGhhcyBub3QgYmVlbiByZWNlaXZlZCB5ZXQnKQogICAgICAgICAgICBmdXR1cmUuc2V0X3Jlc3VsdChpdGVtKQoKICAgICAgICBzdXBlcigpLl9fc2V0aXRlbV9fKGtleSwgaXRlbSkKCiAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaXRlbTogc3RyKSAtPiBBbnk6CiAgICAgICAgaWYgaXRlbSBpbiBzZWxmLl9hd2FpdF90YXNrOgogICAgICAgICAgICBzZWxmLl9hd2FpdF90YXNrLnBvcChpdGVtKQoKICAgICAgICByZXR1cm4gc3VwZXIoKS5fX2dldGl0ZW1fXyhpdGVtKQoKICAgIGFzeW5jIGRlZiBhd2FpdF9lbGVtKHNlbGYsIGtleTogc3RyKSAtPiBBbnk6CiAgICAgICAgZnV0dXJlID0gYXN5bmNpby5GdXR1cmUoKQogICAgICAgIHNlbGYuX2F3YWl0X3Rhc2tba2V5XSA9IGZ1dHVyZQogICAgICAgIGF3YWl0IGZ1dHVyZQogICAgICAgIHJldHVybiBmdXR1cmUucmVzdWx0KCkKCgphc3luYyBkZWYgc2V0X2VsZW0oYXc6IEF3YWl0RGljdCwga2V5OiBzdHIsIHZhbHVlOiBBbnkpOgogICAgYXdhaXQgYXN5bmNpby5zbGVlcCgzKQogICAgYXdba2V5XSA9IHZhbHVlCgoKYXN5bmMgZGVmIG1haW4oKToKICAgIG15X2RpY3QgPSBBd2FpdERpY3QoKQogICAgYXN5bmNpby5jcmVhdGVfdGFzaygKICAgICAgICBzZXRfZWxlbSgKICAgICAgICAgICAgYXc9bXlfZGljdCwKICAgICAgICAgICAga2V5PScxMjMnLAogICAgICAgICAgICB2YWx1ZT0xMjMKICAgICAgICApCiAgICApCiAgICBkYXRhID0gYXdhaXQgbXlfZGljdC5hd2FpdF9lbGVtKCcxMjMnKQogICAgcHJpbnQoZGF0YSkKICAgIHByaW50KG15X2RpY3RbJzEyMyddKQoKYXN5bmNpby5ydW4obWFpbigpKQo=
				
				
				
				
				
			 
			
				
			
			
				
	
		
	
	
	Traceback (most recent call last):
  File "/usr/lib/python3.7/py_compile.py", line 143, in compile
    _optimize=optimize)
  File "<frozen importlib._bootstrap_external>", line 791, in source_to_code
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "./prog.py", line 8
    def __init__(self, dict=None, /, **kwargs):
                                  ^
SyntaxError: invalid syntax
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/usr/lib/python3.7/py_compile.py", line 147, in compile
    raise py_exc
py_compile.PyCompileError:   File "./prog.py", line 8
    def __init__(self, dict=None, /, **kwargs):
                                  ^
SyntaxError: invalid syntax