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