Python 3.10+: вызов асинхронной функции внутри свойства таким образом, чтобы не создавать ошибок, если к этому свойству ⇐ Python

Программы на Python
Anonymous
Python 3.10+: вызов асинхронной функции внутри свойства таким образом, чтобы не создавать ошибок, если к этому свойству

Сообщение Anonymous »

Я создал библиотеку, включающую ORM со следующим шаблоном использования:

Код: Выделить всё

class Model(SqlModel):
columns = ('id', 'details', 'parent_id')
parent: RelatedModel

Model.parent = belongs_to(Model, Model, 'parent_id')
...
def example(some_id, some_other_id):
record = Model.find(some_id)
record.parent = Model.find(some_other_id)
record.parent().save()
Самое последнее улучшение заключается в том, что связанные модели, доступ к которым осуществляется через свойство, загружаются при первом чтении свойства, чтобы пользователям библиотеки не приходилось писать model.parent().reload() до первого доступа к свойству. Например. parent_details = Model.find(some_id).parent.details.
Пример реализации в синхронном отношении можно найти здесь.
Я скопировал всю модель SQL, построитель запросов и ORM для использования асинхронности. Пример реализации в асинхронном отношении можно найти здесь. Шаблон асинхронного использования аналогичен синхронному:

Код: Выделить всё

class AsyncModel(AsyncSqlModel):
columns = ('id', 'details', 'parent_id')
parent: AsyncRelatedModel

AsyncModel.parent = async_belongs_to(AsyncModel, AsyncModel, 'parent_id')
...
async def example(some_id, some_other_id):
record = await AsyncModel.find(some_id)
record.parent = await AsyncModel.find(some_other_id)
await record.parent().save()
Чтение свойства в асинхронной функции (например, Parent_details = (await AsyncModel.find(some_id)).parent.details) приводит к ошибке RuntimeError: asyncio.run() не может вызываться из текущего цикла событий. Я попытался это исправить, заменив asyncio.run на asyncio.get_running_loop().run_until_complete, но это привело к ошибке RuntimeError: этот цикл событий уже запущен. Я попытался запустить его в новом цикле, но это привело к ошибке RuntimeError: невозможно запустить цикл событий, пока работает другой цикл. Использование пакета Nest-asyncio удалило ошибку RuntimeError, но привело к появлению ResourceWarning для незамкнутого цикла событий, а репозиторий пакета был заархивирован, поэтому мне нужно лучшее решение.
Совет из аналогичного вопроса — переписать функцию так, чтобы она была асинхронной, но это неправдоподобное решение для свойства.
Есть ли решение, которое не требует повторного преобразования разработать шаблон использования всей библиотеки или зависит от заброшенного пакета?

Подробнее здесь: https://stackoverflow.com/questions/790 ... -not-produ

Вернуться в «Python»