Мне нужно реализовать тип отображения в приложении asyn c Python 3 (я использую tornadoweb, но это может быть любое событие l oop.)
Я хотел бы принять преимущество пакета collections.abc
. При отображении следует использовать mongodb (точнее, Motor https://motor.readthedocs.io/en/stable/) для хранения пар ключ-значение.
Моя проблема в том, что MutableMapping не имеет версии ayn c. Например:
from collections.abc import MutableMapping
class AsyncMongoMap(MutableMapping):
async def __getitem__(self, key):
return await self.collection.find_one(dict(key=key))["value"]
Теоретически все абстрактные методы (__getitem__, __setitem__, __delitem__, __iter__ and __len__
) могут быть асин c методами, возвращающими ожидаемые объекты. Это позволило бы мне ждать их, например:
await some_map["key"]
Проблема в том, что __getitem__
не может быть асинхронным c методом. Я все еще могу вернуть ожидаемое от него, но это не поможет. Он не совместим с MutableMapping
. Например, метод get()
ожидает, что getitem вызовет KeyError, когда ключ отсутствует в отображении. Так что если __getitem__
вернет ожидаемое, то get()
просто не будет работать (и его все равно нельзя ожидать). Так что это никогда не сработает:
await some_map.get("key", "default_value")
Хорошим решением было бы использовать collections.abc.AsyncMutableMapping
, если бы была такая вещь. Я мог бы написать свою собственную версию, но это кажется плохой идеей. Это общая проблема, связанная с отсутствием асин c версий абстрактных базовых классов.
Существует ли для этого "наилучшая практика"? Должен ли я написать и опубликовать sh новый пакет для реализации абстрактных базовых классов asyn c? Или, может быть, в Python уже есть что-то для этого, просто я не знаю об этом?